先看一个多线程程序:(罗云彬Win32中的一个多线程程序)
●用对话框做主界面,对话框中放置“计数”按钮和“暂停/恢复”按钮,并有一个编辑框用来显示计数结果。
● 开始计数之前,“暂停/恢复”按钮处于灰化状态,当开始计数后,该按钮被激活,用户按动一次这个按钮,则计数暂停,再一次按动,则继续计数。
● 开始计数后,“计数”按钮上的文字将被改为“停止计数”,如果按下“停止计数”按钮,程序将恢复初始状态——第一个按钮变回“计数”按钮,同时灰化“暂停/恢复”按钮。
主要程序代码:
int dwOption; //标志位、0x00000000
int F_PAUSE=1; //暂停、0x00000001
int F_STOP=2; //停止、0x00000010
int F_COUNTING=4;//计数、0x00000100
DWORD WINAPI Counter(LPVOID pParam)
{
dwOption|=F_COUNTING; //计数开始,按位与得0x00000100;
dwOption&=~(F_STOP|F_PAUSE); //排除其他两个标志位的干扰,
SetDlgItemText(_hDlg,IDC_COUNTER,"停止计数");
EnableWindow(hPause,TRUE); //激活暂停/恢复按钮
while(!(dwOption&F_STOP)){ //按位与判断"停止"间是否按下,按下(0x00000010)则跳出计数循环(逻辑运算!2为0)
if(!(dwOption&F_PAUSE)){ //同理,判断“停止”是否按下,不需灰化按钮,则不需跳出循环
counter++;
sprintf(str,"%d",counter);
SetDlgItemText(_hDlg,IDC_STATIC2,str);
}
}
SetDlgItemText(_hDlg,IDC_COUNTER,"计数");
EnableWindow(hPause,FALSE); //灰化暂停/恢复按钮
dwOption&=~(F_COUNTING|F_STOP|F_PAUSE); //按位取反(0x00000111)后(0x11111000)在按位与,
//即将标志为dwOption全部置零后退出循环
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)
{
DialogBoxParam(hInstance,(LPCSTR)IDM_DLG,NULL,(DLGPROC)DialogProc,NULL);
ExitProcess(NULL);
}
LRESULT CALLBACK DialogProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
LPDWORD dwTemp;
switch(message)
{
case WM_CLOSE:
EndDialog(hDlg,NULL);
break;
case WM_INITDIALOG:
hPause=GetDlgItem(hDlg,IDC_PAUSE);
hCounter=GetDlgItem(hDlg,IDC_COUNTER);
hStatic=GetDlgItem(hDlg,IDC_STATIC2);
EnableWindow(hPause,FALSE);
SetDlgItemText(hDlg,IDC_STATIC2,"0");
break;
case WM_COMMAND:
switch(wParam){
case IDC_COUNTER:
_hDlg=hDlg;
if(dwOption&F_COUNTING){ //做按位与运算,程序状态是否在计数状态
dwOption|=F_STOP; //若在,按位与(0x00000100|0x00000010)计入停止状态(0x00000110)
}
else{ //否则,不再计数状态,则开始计数线程
h_Thread=CreateThread(NULL,0,Counter,NULL,NULL,&dwThreadID);//创建线程,其中线程函数为Counter
if(!h_Thread){
MessageBox(hDlg,"创建新的线程失败",NULL,MB_OK);
CloseHandle(h_Thread);
}
break;
case IDC_PAUSE:
dwOption^=F_PAUSE; //按位异或:两个相应位相同,则结果为0,否则为1;作用,根据每次点击,
//设置F_PAUSE位的取反,对应线程函数中的if(!(dwOption&F_PAUSE))语句;
break;
}
}
return 0;
}
总结,位运算符可以很好的根据标志位来判断程序的执行流程,且结构分明。