#c #windows #multithreading
#c #Windows #многопоточность
Вопрос:
У меня есть способ настроить окно в Windows, написанный на C. Он использует стандартный код, который выглядит следующим образом:
WNCDCLASS w1 = {0};
w1.lpszClassName = TEXT( "the_window" );
w1.lpfnWndProc = methodIWantOnItsOwnThread;
// snip
Теперь я выполняю многопоточность с помощью потоков amp;ltprocess.h> таким методом, как:
HANDLE h;
h = (HANDLE) _beginthread(methodIWantOnItsOwnThread, 0, 0);
Как я могу выполнять многопоточность подобным образом в функции обратного вызова Windows, например, с помощью w1.lpfnWndProc = methodIWantOnItsOwnThread;
?
Еще код.
HWND SetupWindow(int device)
{
HWND hwnd;
WNDCLASS w1 = {0};
if (device == 1)
{
w1.lpszClassName = TEXT( "window 1" );
w1.lpfnWndProc = methodIWantThreaded;
}
else
{
w1.lpszClassName = TEXT( "window 2" );
w1.lpfnWndProc = otherMethodIWantThreaded;
}
w1.hInstance = 0;
w1.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
w1.hCursor = LoadCursor(0, IDC_ARROW);
RegisterClass(amp;w1);
hwnd = CreateWindow( w1.lpszClassName, TEXT("The Window"),
WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 520, 650, 520, NULL, NULL, 0, NULL);
SetTimer(hwnd, 0,30,NULL);
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
return hwnd;
}
Комментарии:
1. Ваш вопрос немного неясен: вы хотите, чтобы ваш поток напрямую обрабатывал события окна? В этом случае все, что вам нужно, это цикл событий.
2. Я так думаю. На самом деле у меня будет 2 окна (оба вызываются одним и тем же методом), и я хочу, чтобы оба были в их собственном потоке. Должен ли я добавить больше кода?
3. Почему бы сначала не создать поток и в этой функции потока создать окно
4. В основном из-за моего незнания этого синтаксиса потоков. Кажется, что для запуска потока вам нужно передать ему функцию. Однако для этой функции требуется несколько параметров. На самом деле я не уверен, как это изложить..
Ответ №1:
Вы делаете это в обратном направлении, и это не сработает.
Вы должны создавать поток в каждом окне, а не в каждом потоке, создающем окно. Затем вы просто создаете несколько экземпляров WNDCLASS
classname, и у каждого есть свой собственный поток, который может отправлять и получать сообщения.
Это также дает вам дескриптор окна, который окно вашего основного потока может использовать для отправки и получения сообщений, позволяя вам передавать информацию потокам (и наоборот).
Комментарии:
1. Не могли бы вы немного пояснить? Я обновлю свой вопрос более полным методом.
2. Создайте новое окно с помощью
CreateWindow/CreateWindowEx
, и в ответ наWM_CREATE
сообщение вы создаете поток с помощью_beginthread
. Поток регистрирует обратный вызов потока, который является частью этого окна, и начинает делать то, что он должен делать. Он может использовать обратный вызов для обновления информации в своем родительском окне и т.д. (Я не могу предоставить код для этого; я целую вечность не использовал прямой C с WinAPI, потому что сейчас есть так много более удобных способов сделать что-то. Вероятно, я мог бы найти что-нибудь в своих архивах, но вы, вероятно, можете найти это быстрее через SO, Google или MSDN.)
Ответ №2:
Почему вы хотите это сделать?
Процедура window выполняется в потоке, который создал дескриптор окна. Конечно, в соответствии с расширением, каждый поток, создающий дескрипторы окон, должен иметь цикл обмена сообщениями.
Комментарии:
1. Я бы хотел это сделать, потому что создание этих окон вызывает некоторые методы, которые обновляют то, что появляется на экране, и я хочу, чтобы они использовались в отдельных потоках