Создание потока в оконном приложении - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Как грамотно создать поток в оконном приложении? Я планирую для этой цели использовать функцию Win32 API CreateThread(). В инете нашёл исходник, там CreateThread() вызывается из оконной процедуры, но мне это не нравится, ибо запускать поток мне надо 1 раз при старте проги, потому хочу вызвать её раньше - до цикла обработки сообщений. Вопрос: в какой строке (или точнее сказать между какими строками) в коде ниже лучше всего вызвать CreateThread(), причём до GetMessage(), вне циклов?
#include <windows.h>
 
const char g_szClassName[] = "myWindowClass";
// Step 4: the Window Procedure
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg) {
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wc;
    HWND hwnd;
    MSG Msg;
 
    //Step 1: Registering the Window Class
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = g_szClassName;
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
 
    if(!RegisterClassEx(&wc)) {
        MessageBox(NULL, "Window Registration Failed!", "Error!",
                   MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }
 
    // Step 2: Creating the Window
    hwnd = CreateWindowEx(
               WS_EX_CLIENTEDGE,
               g_szClassName,
               "The title of my window",
               WS_OVERLAPPEDWINDOW,
               CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
               NULL, NULL, hInstance, NULL);
 
    if(hwnd == NULL) {
        MessageBox(NULL, "Window Creation Failed!", "Error!",
                   MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }
 
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);
 
    // Step 3: The Message Loop
    while(GetMessage(&Msg, NULL, 0, 0) > 0) {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}

Решение задачи: «Создание потока в оконном приложении»

textual
Листинг программы
Nit = CreateThread (  NULL,  0,  ( LPTHREAD_START_ROUTINE ) & zapprgVyp,  NULL,  0,  & IdNiti  );

Объяснение кода листинга программы

  1. Nit - это дескриптор потока, который создается функцией CreateThread.
  2. NULL - это значение, которое передается в качестве аргумента для функции CreateThread. Это указывает, что новый поток не будет использовать ни один из существующих потоков в качестве шаблона.
  3. 0 - это значение, которое передается в качестве аргумента для функции CreateThread. Это указывает, что новый поток не будет иметь никакого специального описания, и его параметры будут установлены в значения по умолчанию.
  4. ( LPTHREAD_START_ROUTINE ) & zapprgVyp - это указатель на функцию, которую новый поток будет выполнять. Здесь zapprgVyp - это имя функции, а & указывает на то, что мы передаем адрес этой функции.
  5. NULL - это значение, которое передается в качестве аргумента для функции CreateThread. Это указывает, что новый поток не будет использовать никаких дополнительных аргументов.
  6. 0 - это значение, которое передается в качестве аргумента для функции CreateThread. Это указывает, что новый поток не будет иметь никаких специальных атрибутов.
  7. & IdNiti - это переменная, которая получает дескриптор нового потока от функции CreateThread. Здесь IdNiti - это имя переменной, а & указывает на то, что мы передаем адрес этой переменной.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.429 из 5
Похожие ответы