[WTL] Dialog+thread
От: IvanIvanich  
Дата: 05.03.09 07:23
Оценка:
VC2008+WTL8.0
Есть не модальный WTL диалог, на нем две кнопки: Start и Stop.
По клику на кнопку Start:
а) создается Event
б) создается новая Thread
в) WaitForSingleObject на Thread
По клику на Stop:
а) SetEvent для созданного Event
В процедуре для новой Thread просто WaitForSingleObject для Event
Вот код:
HANDLE g_hExit = 0;
unsigned __stdcall ThreadFunc( void* pArguments )
{
    WaitForSingleObject(g_hExit,INFINITE);
    _endthreadex( 0 );
    return 0;
} 
LRESULT CMainDlg::OnBnClickedStart(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
    g_hExit = CreateEvent(NULL, TRUE, FALSE, NULL);
    HANDLE hThread = (HANDLE)_beginthreadex(NULL,0,ThreadFunc,(void*)this, 0,NULL);
    WaitForSingleObject(hThread,INFINITE);
    CloseHandle(hThread);
    CloseHandle(g_hExit);
    g_hExit = NULL;
    return 0;
}
LRESULT CMainDlg::OnBnClickedStop(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
    if (g_hExit)
        SetEvent(g_hExit);
    return 0;
}

При нажатии на кнопку Start нить создается, процедура запускается и после этого приложение перестает реагировать. Как я понимаю, что перестают обрабатываться сообщения в основной нити. Как сделать, чтобы они обрабатывались.
Спасибо.
Ivan Ivanich
Re: [WTL] Dialog+thread
От: BuHHunyx Беларусь  
Дата: 05.03.09 07:44
Оценка: 3 (1)
Здравствуйте, IvanIvanich, Вы писали:

[]

В мсдн все написано:

WaitForSingleObject
Use caution when calling the wait functions and code that directly or indirectly creates windows. If a thread creates any windows, it must process messages. Message broadcasts are sent to all windows in the system. A thread that uses a wait function with no time-out interval may cause the system to become deadlocked. Two examples of code that indirectly creates windows are DDE and the CoInitialize function. Therefore, if you have a thread that creates windows, use MsgWaitForMultipleObjects or MsgWaitForMultipleObjectsEx, rather than WaitForSingleObject.


Выход — использовать MsgWaitForMultipleObjects(Ex)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: [WTL] Dialog+thread
От: IvanIvanich  
Дата: 05.03.09 08:18
Оценка:
Здравствуйте, BuHHunyx, Вы писали:

BHH>В мсдн все написано:

BHH>Выход — использовать MsgWaitForMultipleObjects(Ex)
Спасибо, то что надо было — заработало. Но теперь немного другая проблема.
Я сделал так:

HANDLE g_hExit = 0;

unsigned __stdcall ThreadFunc( void* pArguments )
{
    WaitForSingleObject(g_hExit,INFINITE);
    _endthreadex( 0 );
    return 0;
} 

LRESULT CMainDlg::OnBnClickedStart(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
    g_hExit = CreateEvent(NULL, TRUE, FALSE, NULL);
    HANDLE hThread = (HANDLE)_beginthreadex(NULL,0,ThreadFunc,(void*)this, 0,NULL);
    while (TRUE)
    {
        MSG msg;
        while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
        { 
            if (msg.message == WM_QUIT){
                SetEvent(g_hExit); 
                break;
            }
            DispatchMessage(&msg); 
        } 
        DWORD dwRet = MsgWaitForMultipleObjects(1,&hThread,FALSE,INFINITE,QS_ALLEVENTS);
        if (dwRet == WAIT_OBJECT_0)
            break;
    };
    CloseHandle(hThread);
    CloseHandle(g_hExit);
    g_hExit = NULL;
    return 0;
}

LRESULT CMainDlg::OnBnClickedStop(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
    if (g_hExit)
        SetEvent(g_hExit);
    return 0;
}

последовательность Start/Stop/Ok работает так как надо.
Но вот последовательность: Start/Ok работает не так как надо: Thread отрабатывает, функция OnBnClickedStart завершается, диалог закрывается, но приложение не завершается Что не так я сделал?
Ivan Ivanich
Re[3]: [WTL] Dialog+thread
От: IvanIvanich  
Дата: 05.03.09 08:24
Оценка:
Здравствуйте, IvanIvanich, Вы писали:

II>Здравствуйте, BuHHunyx, Вы писали:


BHH>>В мсдн все написано:

BHH>>Выход — использовать MsgWaitForMultipleObjects(Ex)
II>Спасибо, то что надо было — заработало. Но теперь немного другая проблема.
II>Но вот последовательность: Start/Ok работает не так как надо: Thread отрабатывает, функция OnBnClickedStart завершается, диалог закрывается, но приложение не завершается Что не так я сделал?
Сам себе отвечаю. Цикл переделал так, теперь работает:
    while (TRUE)
    {
        MSG msg;
        while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) 
        { 
            if (msg.message == WM_QUIT){
                SetEvent(g_hExit); 
                break;
            }
            GetMessage(&msg,NULL,0,0);
            DispatchMessage(&msg); 
        } 
        DWORD dwRet = MsgWaitForMultipleObjects(1,&hThread,FALSE,INFINITE,QS_ALLEVENTS);
        if (dwRet == WAIT_OBJECT_0)
            break;
    };
Ivan Ivanich
Re[3]: [WTL] Dialog+thread
От: BuHHunyx Беларусь  
Дата: 05.03.09 08:47
Оценка:
Здравствуйте, IvanIvanich, Вы писали:

[]
II>последовательность Start/Stop/Ok работает так как надо.
II>Но вот последовательность: Start/Ok работает не так как надо: Thread отрабатывает, функция OnBnClickedStart завершается, диалог закрывается, но приложение не завершается Что не так я сделал?

Висит рабочий поток — нужно дождаться пока он завершится.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.