网上有一些Win32 多线程编程示例,多是控制台版本;下面哥作一个窗口版本;
/*-------------------------------------------------
bobo, 2020
-------------------------------------------------*/
#include <windows.h>
#include <windowsx.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
DWORD WINAPI ThreadProc1(HDC);
DWORD WINAPI ThreadProc2(HDC);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("ThreadDemo") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("Program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, TEXT ("ThreadDemo"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
int x, y ;
PAINTSTRUCT ps ;
RECT rect ;
char buffer[65];
HANDLE hThread1, hThread2;
switch (message)
{
case WM_CREATE:
return 0;
case WM_SIZE :
return 0 ;
case WM_RBUTTONDOWN :
return 0;
case WM_LBUTTONDOWN :
hdc = GetDC(hwnd);
hThread1 = CreateThread(NULL, NULL, ThreadProc1, hdc, NULL, NULL);
hdc = GetDC(hwnd);
hThread2 = CreateThread(NULL, NULL, ThreadProc2, hdc, NULL, NULL);
WaitForSingleObject(hThread1, INFINITE);
WaitForSingleObject(hThread2, INFINITE);
TextOut(hdc, 500, 20, TEXT("我是主线程"), 5);
return 0 ;
case WM_PAINT :
hdc = BeginPaint (hwnd, &ps) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
DWORD WINAPI ThreadProc1(HDC hdc)
{
for (int i = 0; i < 10; i++)
{
TextOut(hdc, 100, 20+i*25, TEXT("我是子线程1"), 6);
}
return 0;
}
DWORD WINAPI ThreadProc2(HDC hdc)
{
TextOut(hdc, 300, 20, TEXT("我是子线程2"), 6);
return 0;
}
按照多线程原理,三个(主,2个子)线程的输出是同步的;
程序要点如下;
在单个的C文件里面;2个线程函数必须预先声明;
DWORD WINAPI ThreadProc1(HDC);
DWORD WINAPI ThreadProc2(HDC);
线程句柄;创建成功之后返回;
HANDLE hThread1, hThread2;
TextOut输出,中文使用TEXT()宏;字符长度汉字也按一个;
TextOut(hdc, 500, 20, TEXT("我是主线程"), 5);
WaitForSingleObject(hThread1, INFINITE);
同步;C#里面应该封装为CMutex之类的类了,记不清了;INFINITE,无限;
注意给线程2传递hdc,要再获取一次hdc,否则线程2不会得到hdc能输出;出了本线程要再获取一次;
见此;
https://blog.csdn.net/bcbobo21cn/article/details/103739479
20+i*25;
每次输出增加Y坐标25;默认字体大约高为20像素,具体记不清了;