Win32 API 多线程编程示例 - 窗口版

网上有一些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像素,具体记不清了;

发布了434 篇原创文章 · 获赞 512 · 访问量 294万+

猜你喜欢

转载自blog.csdn.net/bcbobo21cn/article/details/103865943