ПРИМЕЧАНИЕ : используйте этот код только в том случае, если вам не нужен какой-либо интерфейс, связанный с пользовательским интерфейсом, или какой-либо код, связанный с COM. За исключением таких угловых случаев, этот код работает правильно: особенно хорошо для чистого рабочего потока, ограниченного вычислениями.
DispathMessage
и TranslateMessage
не нужны, если у потока нет окна. Так что просто игнорируйте это. HWND
не имеет никакого отношения к вашему сценарию. Вам вообще не нужно создавать какие-либо окна. Обратите внимание, что для обработки сообщений, связанных с интерфейсом Windows, таких как WM_KEYDOWN и WM_PAINT, необходимы две * функции сообщений.
Я также предпочитаю сообщения Windows для синхронизации и связи между потоками, используя PostThreadMessage
и GetMessage
или PeekMessage
. Я хотел вырезать и вставить из своего кода, но я просто кратко набросал идею.
#define WM_MY_THREAD_MESSAGE_X (WM_USER + 100)
#define WM_MY_THREAD_MESSAGE_Y (WM_USER + 100)
// Worker Thread: No Window in this thread
unsigned int CALLBACK WorkerThread(void* data)
{
// Get the master thread's ID
DWORD master_tid = ...;
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
if (msg.message == WM_MY_THREAD_MESSAGE_X)
{
// Do your task
// If you want to response,
PostThreadMessage(master_tid, WM_MY_THREAD_MESSAGE_X, ... ...);
}
//...
if (msg.message == WM_QUIT)
break;
}
}
return 0;
}
// In the Master Thread
//
// Spawn the worker thread
CreateThread( ... WorkerThread ... &worker_tid);
// Send message to worker thread
PostThreadMessage(worker_tid, WM_MY_THREAD_MESSAGE_X, ... ...);
// If you want the worker thread to quit
PostQuitMessage(worker_tid);
// If you want to receive message from the worker thread, it's simple
// You just need to write a message handler for WM_MY_THREAD_MESSAGE_X
LRESULT OnMyThreadMessage(WPARAM, LPARAM)
{
...
}
Я немного боюсь, что это то, что вы хотели. Но код, я думаю, очень легко понять. В общем случае поток создается без очереди сообщений. Но когда вызывается связанная с окном функция сообщения, то очередь сообщений для потока инициализируется. Пожалуйста, обратите внимание, что для отправки / получения оконных сообщений окно не требуется.