Доброго времи суток
Была поставлена задача — управление потоком. То есть, поток запускается, каким-то образом необходимо сообщить ему, чтобы начал работать и после этого чтобы нормально завершился.
Пришел к следующему — управление через 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. Результат один (см. выше).
Спасибо.