Создание потока в оконном приложении - 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- это имя переменной, а&указывает на то, что мы передаем адрес этой переменной.