Многопоточность функции обратного вызова Windows

#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. Я бы хотел это сделать, потому что создание этих окон вызывает некоторые методы, которые обновляют то, что появляется на экране, и я хочу, чтобы они использовались в отдельных потоках