Создание потока в оконном приложении - 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 );
Объяснение кода листинга программы
Nit
- это дескриптор потока, который создается функциейCreateThread
.NULL
- это значение, которое передается в качестве аргумента для функцииCreateThread
. Это указывает, что новый поток не будет использовать ни один из существующих потоков в качестве шаблона.0
- это значение, которое передается в качестве аргумента для функцииCreateThread
. Это указывает, что новый поток не будет иметь никакого специального описания, и его параметры будут установлены в значения по умолчанию.( LPTHREAD_START_ROUTINE ) & zapprgVyp
- это указатель на функцию, которую новый поток будет выполнять. ЗдесьzapprgVyp
- это имя функции, а&
указывает на то, что мы передаем адрес этой функции.NULL
- это значение, которое передается в качестве аргумента для функцииCreateThread
. Это указывает, что новый поток не будет использовать никаких дополнительных аргументов.0
- это значение, которое передается в качестве аргумента для функцииCreateThread
. Это указывает, что новый поток не будет иметь никаких специальных атрибутов.& IdNiti
- это переменная, которая получает дескриптор нового потока от функцииCreateThread
. ЗдесьIdNiti
- это имя переменной, а&
указывает на то, что мы передаем адрес этой переменной.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д