Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Поток, Окно, Выход.

23K
27 ноября 2009 года
CyberManiac
9 / / 02.02.2007
Привет. У меня такая проблема, не знаю как решить.
Есть приложение. Оно подрубает мою длл. Длл создаёт поток и в нём создаёт ещё одно окно. Но беда приходит когда надо уничтожить это окно. Если я посылаю ему QUIT или DESTROY то закрывается всё приложение, а не только то которое было создано при помощи моего длл. Как закрыть это окно правильно? Уничтозыть руками? Как?
11
27 ноября 2009 года
oxotnik333
2.9K / / 03.08.2007
гуи должно создаваться, работать и уничтожаться в одном потоке.
23K
27 ноября 2009 года
CyberManiac
9 / / 02.02.2007
Цитата: oxotnik333
гуи должно создаваться, работать и уничтожаться в одном потоке.



шлю я окну в потоке где оно создалось DestroyWindow(hwnd);. всё равно закрывается всё приложение, а не только это окно, которое создано в длл.

14
30 ноября 2009 года
Phodopus
3.3K / / 19.06.2008
Как выглядит ваша тредовская петля сообщений?
9.0K
01 декабря 2009 года
grag63
71 / / 23.01.2006
В своей длл я использую следующую конструкцию:
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;
14
01 декабря 2009 года
Phodopus
3.3K / / 19.06.2008
Хватит прикрываться кучей ников
 
Код:
case WM_DESTROY:
  PostQuitMessage(0);
23K
01 декабря 2009 года
CyberManiac
9 / / 02.02.2007
Цитата: Phodopus
Хватит прикрываться кучей ников


эээ.. это был не я

не знаю что вам показать
обычный цикл

Код:
while(msg.message != WM_QUIT)
    {
        if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
                ...
                 }
         }

но вот ещё что. этот цикл выполняется в трэдах, а создаются окна получается из главного трэда.
9.0K
02 декабря 2009 года
grag63
71 / / 23.01.2006
void CFlash::Thread(long* lpSt) - новый поток,
в нем создается окно - hWnd = IWin::CreateHandl...,
в нем основной цикл: while(GetMessage(&msg, NULL, 0, 0)) {....
(использование PeekMessage... при большой загрузке у меня приводить к затормаживанию).
В 98 мне хватало DestroyWindow, но в XP из других потоков WM_DESTROY просто не проходит (причины не выяснял), потому отправляю WM_CLOSE, а от туда (из текущего потока) удаляю окно DestroyWindow(hWnd);
Выход из потока происходит по окончании полной обработки сообщения WM_CLOSE.
14
02 декабря 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: CyberManiac
эээ.. это был не я


тогда извиняюсь, просто странным ответ показался

Цитата: CyberManiac
но вот ещё что. этот цикл выполняется в трэдах, а создаются окна получается из главного трэда.


если окна создаются в главном треде, значит петли сообщений в остальных тредах к окнам отношения не имеют.
Сдается мне вы где-то PostQuitMessage() делаете. Наверное на DESTROY как и в примере.

9.0K
02 декабря 2009 года
grag63
71 / / 23.01.2006
Тема достаточно интересная. Мйкрософт проводит на подобные темы олимпиады.
В исходники http://sources.codenet.ru/file/3434/TestSplControl.zip выложил свой вариант (как мог по быстрому подчистил мусор, но не обессудьте). Надеюсь автору темы это поможет.
23K
04 декабря 2009 года
CyberManiac
9 / / 02.02.2007
Phodopus
Тогда как быть? Создавать окно в уже в созданном потоке?
grag63
Спасибо. Гляну.
23K
04 декабря 2009 года
CyberManiac
9 / / 02.02.2007
Цитата:
void CFlash::Thread(long* lpSt) - новый поток,
в нем создается окно - hWnd = IWin::CreateHandl...,
в нем основной цикл: while(GetMessage(&msg, NULL, 0, 0)) {....
(использование PeekMessage... при большой загрузке у меня приводить к затормаживанию).
В 98 мне хватало DestroyWindow, но в XP из других потоков WM_DESTROY просто не проходит (причины не выяснял), потому отправляю WM_CLOSE, а от туда (из текущего потока) удаляю окно DestroyWindow(hWnd);
Выход из потока происходит по окончании полной обработки сообщения WM_CLOSE.


Спасибо. Создание и цикл в одном трэде помогли решить проблему выхода. Но обнаружил что течёт память. У себя стараюсь всё удалять. Грешу на память выделенную под сами окна. Во время работы приложение окна могут создаваться и уничтожатся множество раз. Возможно ли такое что они и жрут память? Или когда трэд завершается, выделенная память под окно освобождается?

14
04 декабря 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: CyberManiac
Возможно ли такое что они и жрут память? Или когда трэд завершается, выделенная память под окно освобождается?


Нет.
Вполне возможно по завершению треда, но может и только по завершению процесса. В вашем случае по-любому необходим DestroyWindow().

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог