进程和线程:
*程序-运行-线程
//一个程序,在运行之前是硬盘上的一个文件,开始运行之后,就是一个进程
*一个进程至少有一个线程,一个进程可以有多个线程(其中有一个主线程)
*简单的程序设计,一个进程一个线程
*高级的程序设计,一个进程多个线程
*任务管理器可以查看进程,不可以查看线程
spy++既可以查看进程,也可以查看线程
简单的程序设计只有一个线程,比如一个简单程序,当主线程还未完成操作时,这时"它"忙着完成
未完成的操作,如果这时用鼠标点击窗口等任何操作,“它”都不会响应,这就是主线程阻塞,比如 一个计算指定数字(由用户输入)以内的数字,当开始计算时,如果数字较大,花费时间较长,就会发 生主线程阻塞,这样操作性大打折扣了,高级的程序设计是一个进程多个线程,当开始计算时,新建一个线程来完成计算的工作,主线程来响应接收的操作,这样主线程就不会发生无响应了
多线程
*创建线程(主线程是自动创建的)
CreateThread() //Windows的函数
_beginthread() //c语言库中的函数,较为简便,在头文件<process.h>里
//其实还是_begintherad去调用CreateThread函数
*线程函数
void _cdeal ThreadProc(void *pParam);
接下来就做一个简单的例子吧,新建一个win32项目,不是空项目,然后消息循环里加上:
case WM_CREATE:
_beginthread(Thread,//函数
0,//第二个参数是新线程所需要使用的堆栈的大小,0表示有系统自动分配
NULL);//函数参数,传给第ThreadA的,这里的例子没有用到
//这样,在创建窗口的时候就创建了一个线程,具体线程干什么就去函数ThreadA里处理
break;
接下来就可以去写Thread函数了,这里Thread就在创建的窗口随机画矩形吧,矩形大小,位置,填充颜色都是随机的,为了当窗口大小改变时任然可以画,所以也要处理WM_SIZE消息,所以将cxClient,cyClient和hWnd都定义为全局变量,以下是Thread函数:
VOID Thread(PVOID pvoid)
{
HDC hdc;
int xLeft, xRight, yTop, yBottom, iRed, iGreen, iBlue;
HBRUSH hBrush;
while (TRUE)
{
if (cxClient != 0 || cyClient != 0)
{
xLeft = rand() % cxClient;
xRight = rand() % cxClient;
yTop = rand() % cyClient;
yBottom = rand() % cyClient;
iRed = rand() % 255;
iGreen = rand() % 255;
iBlue = rand() % 255;
hdc = GetDC(hWnd);//也可以设为NULL,直接在桌面上画,
//这样就不用管cxClient,cyClient了
hBrush = CreateSolidBrush(RGB(iRed, iGreen, iBlue));
SelectObject(hdc, hBrush);
Rectangle(hdc, min(xLeft, xRight), min(yTop, yBottom), max(xLeft, xRight), max(yTop, yBottom));
ReleaseDC(hWnd, hdc);
DeleteObject(hBrush);
Sleep(1000);//让线程暂停,不然运行速度太快,这里就是1000毫秒
}
}
}