多任务和多线程(1)

创建一个线程的API函数叫做CreateThread

hThread=CreateThread(&security_attributee,dwStackSize,ThreadProc,pParam,dwFlags,&idThread);


大部分的Windows程序员都会倾向于使用C的运行时库函数_beginthread()(在头文件process.h中)

hThread=_beginthread(ThreadProc,uiStackSize,pParam);


下面看一个程序(来自Windows程序设计第五版,可以跟前面博客PeekMessage函数比较一下)

#include<windows.h>
#include<process.h>

LRESULT CALLBACK WindowProc(
			HWND hwnd,      // handle to window
			UINT uMsg,      // message identifier
			WPARAM wParam,  // first message parameter
			LPARAM lParam   // second message parameter
			);

HWND hwnd;
int cxClient,cyClient;
int WINAPI WinMain(
		HINSTANCE hInstance,      // handle to current instance
		HINSTANCE hPrevInstance,  // handle to previous instance
		LPSTR lpCmdLine,          // command line
		int nCmdShow              // show state
		)
{
	static TCHAR szAppName[]=TEXT("leidemingzi");
	
	MSG msg;
	WNDCLASS wndclass;

	wndclass.cbClsExtra=0;
	wndclass.cbWndExtra=0;
	wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
	wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);
	wndclass.hInstance=hInstance;
	wndclass.lpfnWndProc=WindowProc;
	wndclass.lpszClassName=szAppName;
	wndclass.lpszMenuName=NULL;
	wndclass.style=CS_HREDRAW|CS_VREDRAW;

	if(!RegisterClass(&wndclass))
	{
		MessageBox(NULL,TEXT("the program require the window nt"),TEXT("tips"),MB_ICONERROR);
		return 0;
	}

	hwnd=CreateWindow(
		szAppName,  // registered class name
		TEXT("this is title"), // window name
		WS_OVERLAPPEDWINDOW,        // window style
		CW_USEDEFAULT,                // horizontal position of window
		CW_USEDEFAULT,                // vertical position of window
		CW_USEDEFAULT,           // window width
		CW_USEDEFAULT,          // window height
		NULL,      // handle to parent or owner window
		NULL,          // menu handle or child identifier
		hInstance,  // handle to application instance
		NULL        // window-creation data
		);

	ShowWindow(hwnd,nCmdShow);
	UpdateWindow(hwnd);

	while(GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return msg.wParam;
}


VOID Thread(PVOID pvoid)
{
	HBRUSH hBrush;
	HDC hdc;
	int xLeft,xRight,yTop,yButtom,iRed,iGreen,iBlue;
	PAINTSTRUCT ps;
	while(TRUE)
	{
		if(cxClient!=0||cyClient!=0)
		{
			xLeft=rand()%cxClient;
			xRight=rand()%cxClient;
			yTop=rand()%cyClient;
			yButtom=rand()%cyClient;

			iRed=rand()%255;
			iGreen=rand()%255;
			iBlue=rand()%255;

			hdc=GetDC(hwnd);
			//hdc=BeginPaint(hwnd,&ps);
			hBrush=CreateSolidBrush(RGB(iRed,iGreen,iBlue));
			SelectObject(hdc,hBrush);

			Rectangle(hdc,min(xLeft,xRight),min(yTop,yButtom),max(xLeft,xRight),max(yTop,yButtom));

			ReleaseDC(hwnd,hdc);
			//EndPaint(hwnd,&ps);
			DeleteObject(hBrush);
		}
	}
	//_endthread();
}
LRESULT CALLBACK WindowProc(
			HWND hwnd,      // handle to window
			UINT uMsg,      // message identifier
			WPARAM wParam,  // first message parameter
			LPARAM lParam   // second message parameter
			)
{
	switch(uMsg)
	{
	case WM_CREATE:
		_beginthread(Thread,0,NULL);//开始线程
		return 0;

	case WM_SIZE:
		cxClient=LOWORD(lParam);
		cyClient=HIWORD(lParam);
		return 0;
		

	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}

	return DefWindowProc(hwnd,uMsg,wParam,lParam);
}


效果跟PeekMessage函数是一样的,随机产生矩形

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值