Поток, Окно, Выход.
Есть приложение. Оно подрубает мою длл. Длл создаёт поток и в нём создаёт ещё одно окно. Но беда приходит когда надо уничтожить это окно. Если я посылаю ему QUIT или DESTROY то закрывается всё приложение, а не только то которое было создано при помощи моего длл. Как закрыть это окно правильно? Уничтозыть руками? Как?
шлю я окну в потоке где оно создалось DestroyWindow(hwnd);. всё равно закрывается всё приложение, а не только это окно, которое создано в длл.
void CFlash::Thread(long* lpSt)
{
MSG msg;
hWnd = IWin::CreateHandle(NULL, infoPtr->x, infoPtr->y,
infoPtr->nWidth, infoPtr->nHeight, NULL, (HMENU)dwID);
if(lpSt) *lpSt = 0;
if(!hWnd) return;
while(GetMessage(&msg, NULL, 0, 0)) { // hWnd
if(!infoPtr || msg.message==WM_DESTROY || msg.message==WM_CLOSE)
break;
if(infoPtr->hAcc){
if(!TranslateAccelerator(hWnd, infoPtr->hAcc, &msg)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
а для закрытия окна отправляю WM_CLOSE:
case WM_CLOSE:
SNDMSG(hWnd, WM_DESTROY, 0, 0); break;
case WM_DESTROY:
PostQuitMessage(0);
// close process handle
return 0;
PostQuitMessage(0);
эээ.. это был не я
не знаю что вам показать
обычный цикл
{
if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
...
}
}
но вот ещё что. этот цикл выполняется в трэдах, а создаются окна получается из главного трэда.
в нем создается окно - hWnd = IWin::CreateHandl...,
в нем основной цикл: while(GetMessage(&msg, NULL, 0, 0)) {....
(использование PeekMessage... при большой загрузке у меня приводить к затормаживанию).
В 98 мне хватало DestroyWindow, но в XP из других потоков WM_DESTROY просто не проходит (причины не выяснял), потому отправляю WM_CLOSE, а от туда (из текущего потока) удаляю окно DestroyWindow(hWnd);
Выход из потока происходит по окончании полной обработки сообщения WM_CLOSE.
тогда извиняюсь, просто странным ответ показался
если окна создаются в главном треде, значит петли сообщений в остальных тредах к окнам отношения не имеют.
Сдается мне вы где-то PostQuitMessage() делаете. Наверное на DESTROY как и в примере.
В исходники http://sources.codenet.ru/file/3434/TestSplControl.zip выложил свой вариант (как мог по быстрому подчистил мусор, но не обессудьте). Надеюсь автору темы это поможет.
Тогда как быть? Создавать окно в уже в созданном потоке?
grag63
Спасибо. Гляну.
в нем создается окно - hWnd = IWin::CreateHandl...,
в нем основной цикл: while(GetMessage(&msg, NULL, 0, 0)) {....
(использование PeekMessage... при большой загрузке у меня приводить к затормаживанию).
В 98 мне хватало DestroyWindow, но в XP из других потоков WM_DESTROY просто не проходит (причины не выяснял), потому отправляю WM_CLOSE, а от туда (из текущего потока) удаляю окно DestroyWindow(hWnd);
Выход из потока происходит по окончании полной обработки сообщения WM_CLOSE.
Спасибо. Создание и цикл в одном трэде помогли решить проблему выхода. Но обнаружил что течёт память. У себя стараюсь всё удалять. Грешу на память выделенную под сами окна. Во время работы приложение окна могут создаваться и уничтожатся множество раз. Возможно ли такое что они и жрут память? Или когда трэд завершается, выделенная память под окно освобождается?
Нет.
Вполне возможно по завершению треда, но может и только по завершению процесса. В вашем случае по-любому необходим DestroyWindow().