Управление потоком
От: nnnickkk  
Дата: 20.05.09 11:24
Оценка:
Доброго времи суток

Была поставлена задача — управление потоком. То есть, поток запускается, каким-то образом необходимо сообщить ему, чтобы начал работать и после этого чтобы нормально завершился.
Пришел к следующему — управление через events (HANDLE).
В качестве примера — код, в котором инициализируется хук перехвата мыши и клавиатуры и в этом же потоке принимаются сообщения от хука.
Присутствуют HANDLE event[2] — соответственно start/stop.
Log() — вывод лога, в консоль для CLI и в контролс для GUI.

DWORD WINAPI mthread(VOID *lp)
{
        DWORD id = GetCurrentThreadId();

        MSG msg;
        BOOL ret;

        int play = 0;
        int hook = 0;
        
        while(1)
        {
                switch (MsgWaitForMultipleObjects(1,&event[play],FALSE,INFINITE,QS_POSTMESSAGE|QS_ALLINPUT))
                {
                        case WAIT_OBJECT_0:
                                if (!play)
                                {
                                        play = 1;
                                        hook = SetInputHooks(id,1,1);
                                        Log("*-- %ld event - start hook=%d",id,hook);
        
                                        ret = PeekMessage(&msg,NULL,WM_USER,WM_USER+20,PM_NOREMOVE);
                                }
                                else
                                {
                                        Log("--* %ld event - exit",id);
                                        ResetInputHooks(id);                                    
                                        ExitThread(0);
                                }
                                break;
                        case WAIT_OBJECT_0+1:
                                ret = GetMessage(&msg,NULL,WM_USER,WM_USER+100);

                                if (ret)
                                        switch (msg.message)
                                        {
                                                case WM_WORK:
                                                        Log("-*- %ld WM_WORK",id);
                                                        break;
                                                case WM_HOOK_MOUSE:
                                                {
                                                        short x = LOWORD(msg.lParam);
                                                        short y = HIWORD(msg.lParam);

                                                        Log("-*- %ld mouse: %d x=%d y=%d",id,msg.wParam,x,y);
                                                }
                                                break;
                                                case WM_HOOK_KEYBOARD:
                                                break;
                                                
                                        }
                                        
                                break;
                }
        }

        return 0L;
}


Результат:
CLI — всё ОК.
GUI — event на завершение потока не "ловится"

Дополнительно.
Предыдущая версия работала на messages (WM_USER+) с тем же эффектом — с какого-то момента принимались или только внешние сообщения или только сообщения от управляющего потока.

Всё тестировалось в MinGW, VC6, VC8. Результат один (см. выше).

Спасибо.
winapi threads msgwaitformultipleobjects
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.