Junk
Гость
|
|
« : 17-11-2006 13:57 » |
|
Создаю поток и передаю в него в качестве параметра хэндл окна ptThreadIn = CreateThread( NULL, 0,(LPTHREAD_START_ROUTINE) ICMPin, (LPVOID) h_wnd, 0, 0); В потоке жду поступления данных и, в случае появления данных, оповещаю об этом диалог DWORD WINAPI ICMPin (LPVOID lpThreadData) { int result=0;
LP_APK Temp; HWND HWnd = (HWND)lpThreadData;
while(bStopHear==false) { if(iRead != iDecode) { if (FirApk == NULL) break; Temp = FirApk; while ((StrCmp(Temp->address,inet_ntoa(messag[iDecode].SokAdr.sin_addr)) != 0) && (Temp->next != NULL)) Temp = Temp->next;
DecodeICMPHeader(Temp,messag[iDecode].RecvingText); iDecode++; if (iDecode == NUM_PACKETS) iDecode = 0; PostMessage(HWnd, ID_REDRAW_CTRLLIST, 0, 0); } Sleep(0); }
return result; } При компиляции в качестве Debug - все нормально, при компиляции в качестве Release - выдает в этом месте PostMessage(HWnd, ID_REDRAW_CTRLLIST, 0, 0); ошибку доступа к памяти - память не может быть Read. Че делать?
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #1 : 17-11-2006 14:10 » |
|
MFC проект? Как определён h_wnd?
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Junk
Гость
|
|
« Ответ #2 : 17-11-2006 14:20 » |
|
Ага, MFC. В главном диалоге h_wnd предствлен как this->m_hWnd
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #3 : 17-11-2006 15:39 » |
|
Junk, при условии наличия отсутствия других проблем, для которых просто не хватает инфы, попробуй заменить использование хэндла на указатель. Вообще-то это одна из задач MFC. Защищать такие вещи. Те
ptThreadIn = CreateThread( NULL, 0,(LPTHREAD_START_ROUTINE) ICMPin, (LPVOID)this, 0, 0);
...
// HWND HWnd = (HWND)lpThreadData; CWnd *pWnd = (CWnd*)lpThreadData;
// PostMessage(HWnd, ID_REDRAW_CTRLLIST, 0, 0); pWnd->PostMessage(ID_REDRAW_CTRLLIST, 0, 0);
Если это не поможет, то пиши подробней. Код диалога в месте вызова тредной ф-ции. Какой диалог? Модальный?
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Junk
Гость
|
|
« Ответ #4 : 20-11-2006 09:38 » |
|
Че-то не помогает В главном окне вызываю функцию инициализации: SocketInit((LPVOID)this); Сама функция выглядит так: int SocketInit (LPVOID h_wnd) { CWnd *pWnd = (CWnd*)h_wnd;
... ptThreadIn = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE) ICMPin, (LPVOID) h_wnd, 0, 0);
if ( WSAAsyncSelect(icmp, pWnd->m_hWnd, WM_SOCKET, FD_READ) == SOCKET_ERROR) return WSAGetLastError();
return 0; } В функции WSAAsyncSelect указатель на окно диалога работает без проблем, а вот в созданном потоке: DWORD WINAPI ICMPin (LPVOID lpThreadData) { int result=0;
LP_APK Temp; // HWND HWnd = (HWND)lpThreadData; CWnd *pWnd = (CWnd*)lpThreadData;
while(bStopHear==false) { if(iRead != iDecode) { ... DecodeICMPHeader(Temp,messag[iDecode].RecvingText); iDecode++; if (iDecode == NUM_PACKETS) iDecode = 0; pWnd->PostMessage(ID_REDRAW_CTRLLIST, 0, 0); //PostMessage(HWND_BROADCAST, ID_REDRAW_CTRLLIST, 0, 0); } Sleep(0); }
return result; } pWnd->PostMessage(ID_REDRAW_CTRLLIST, 0, 0); вызывает ошибку
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #5 : 20-11-2006 10:05 » |
|
А какую? Ту же самую?
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Junk
Гость
|
|
« Ответ #6 : 20-11-2006 10:06 » |
|
Access Violation
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #7 : 20-11-2006 10:27 » |
|
В принципе вещь тривиальная... Посему предположу следующее:
В этом месте всё в порядке. Проблема может заключатся в том, что где-то в другом месте происходит повреждение памяти. Например переполнение буфера. Это объяснит "нормальность" в дебаге. Тк дебаггер резервирует больше места для своих нужд, в то время как релиз работает в притык. Я уже где-то на форуме подробно рассказывал, как это работает, вернее, почему не работает в релизе.
Проект большой? Если не очень, то в архив и на мыло.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Junk
Гость
|
|
« Ответ #8 : 20-11-2006 11:32 » |
|
кинул. проблема именно в PostMessage - если задокументировать эту функцию, все идет нормально
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #9 : 20-11-2006 14:04 » |
|
ок вечерком гляну
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #10 : 21-11-2006 00:05 » |
|
Блиин... вы что сговорились?
В общем так, PostMessage работает. Вылетает где-то в другом месте. Чтобы отслеживать в релизе пользуйся ф-ей OutputDebugString("Любой текст"); Отлавливать можно DebugView. Я именно так и сделал в ф-ции
void CEYEDlg::RedrawCtrlList(void)
которая вызывается из треда. Она вызывается несколько раз. Потом вылетает. Дальше пока не посмотрел. Тут может быть что-то с данными для ListCtrl. К сожалению твои коментарии на моей буржуинско-вражеской системе не показываются нормально. Надо будет принять меры. Так что я пока не совсем понял, что именно там происходит.
Обрати внимание на SendIcmpPacket, там тоже кусок памяти резервируется. Короче в подозрительные места встраивай OutputDebugString("1");
Я делаю всегда с однозначным номером и/или сопроводительным текстом - имя ф-ции и тд. Тогда по последнему номеру будет видно где вылетела.
Пока всё.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Junk
Гость
|
|
« Ответ #11 : 21-11-2006 09:18 » |
|
Согласен, пару раз он проходит RedrawCtrlList. Но если задокументировать PostMessage, то он вообще не вылетает. Причем, что интересно, если PostMessage оставить, а задокументировать все строчки в RedrawCtrlList(void), то он все равно вылетает, когда окно теряет фокус
|
|
« Последнее редактирование: 21-11-2006 09:31 от Junk »
|
Записан
|
|
|
|
|