Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: хэндл диалога  (Прочитано 11485 раз)
0 Пользователей и 1 Гость смотрят эту тему.
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.
Че делать?
Записан
Джон
просто
Администратор

de
Offline 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
Записан
Джон
просто
Администратор

de
Offline 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); вызывает ошибку
Записан
Джон
просто
Администратор

de
Offline 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
Записан
Джон
просто
Администратор

de
Offline 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 - если задокументировать эту функцию, все идет нормально
Записан
Джон
просто
Администратор

de
Offline 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."
Джон
просто
Администратор

de
Offline 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 » new

Согласен, пару раз он проходит RedrawCtrlList. Но если задокументировать PostMessage, то он вообще не вылетает. Причем, что интересно, если PostMessage оставить, а задокументировать все строчки в RedrawCtrlList(void), то он все равно вылетает, когда окно теряет фокус
« Последнее редактирование: 21-11-2006 09:31 от Junk » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines