Нет, все сообщения должны обрабатываться в одном потоке.Этот отдельный поток часто называют потоком пользовательского интерфейса, поскольку именно он управляет пользовательским интерфейсом.Попытка обработки сообщений пользовательского интерфейса в потоке, не связанном с пользовательским интерфейсом, просто вызовет у вас затруднения.
Однако распространенной проблемой являются приложения, выполняющие длительные вычислительные задачи в ответ на конкретные сообщения.Это не очень хорошо работает, потому что, пока код выполняется внутри обработчика сообщений, приложение не может обрабатывать других сообщений (потоки могут выполнять только одно действие за раз), и ваш пользовательский интерфейс перестает отвечать на запросы..
Решение состоит в том, чтобы раскрутить другой поток (или два, или сколько вам нужно) и делегировать длительные, требующие большого объема вычислений задачи этому потоку.Вы по-прежнему будете обрабатывать сообщения в одном потоке пользовательского интерфейса, но внутри обработчиков сообщений вы будете передавать задачу вспомогательным потокам.Вы часто будете слышать это как шаблон «рабочий поток» или «фоновый поток».
Вы можете создавать дополнительные потоки, используя CreateThread
функцию .Вы можете найти образец здесь .
В этом случае звучит так, что QueueUserWorkItem
функция может быть более простой опцией.Пример кода:
DWORD CALLBACK ThreadProc(LPVOID p)
{
HWND hWnd = reinterpret_cast<HWND>(p);
for (int i = 0; i < 100000; ++i)
{
// do whatever
}
return 0;
}
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_KEYDOWN: // or whatever message you want to respond to
{
QueueUserWorkItem(ThreadProc, hWnd, WT_EXECUTELONGFUNCTION);
return 0;
}
// process other messages...
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
Требуемое чтение для пулов потоков Win32 здесь .