Автор
|
Тема: Document/View блин.
|
ServerMouse |
опубликован 14-09-2001 18:20 MSK
Ситуёвина такая. Хочу я связываться по сети с кем-то и лапсать оттуда небольшие данные в приложение типа сабж. Организую класс моего сокета, и при OnNewDocument() создаю его, инициализирую, и передаю this в конструктор.Получил я какие-то данные и делаю из класса сокетов pDoc->UpdateAllViews(NULL); Всё, ексцепшин. Гдето в wincore.cpp(сорцы MFC). Почему? Ведь этаж ф-ция нормально работает если вызвать её из CSomeView.
|
ServerMouse
|
опубликован 14-09-2001 18:34 MSK
О! Круг сужается. Дело в том, что я для работы с сокетом создаю отдельную Thread. Ф-ция статическая, принадлежит этому же классу сокетов. И если точнее то я делаю так:class CMySock { CMyDoc* pDoc; CMySock(CMyDoc* _pDoc) {pDoc=_pDoc;} ......... SomeFun(); static DWORD WINAPI SockThread(LPVOID ts); } CMySock::SomeFun() { DWORD ThrID; ThreadID=CreateThread (NULL,0,SockThread,this,NULL,&ThrID); } DWORD WINAPI CCafe::SockThread(LPVOID ts) { CCafe* MyClass=(CCafe*)ts; |
ServerMouse
|
опубликован 14-09-2001 18:37 MSK
Блин случайно нажал. Так вот: DWORD WINAPI CCafe::SockThread(LPVOID ts) { CMySock* MyClass=(CMySock*)ts; ...... WSAWaitForMultipleEvents(....) ... MyClass->pDoc->UpdateAllViews(NULL) .... }Вот именно сдесь и вылазит exception....
|
Kosha
|
опубликован 16-09-2001 13:12 MSK
Сам с этой проблемой недели 2 муд@хался ;-))) Дело в том, что при работе с несколькими thread винда, а точнее, MFC, теряет map окон, и ASSERT_VALID на окне валится, если вызван не из того thread, где оно было создано.Сделай так: поставь USER мессагу, и шли какому-нить окну (например, MainFrame, а можно, в принципе, и CDocument, тока я не въехал, как ;-))) ) Передавай hwnd на нее в dwUser, шли через SendMessage, а в обработчике UpdateAllViews. Работает как часы... Тока надо осторожнее с CriticalSection'ами... |