例程分析多线程编程[图](2)
参数dwCreationFlags指定了线程创建的特性;
参数 lpThreadId 指向一个DWORD变量,可返回线程ID值。
如果创建成功则返回线程的句柄,否则返回NULL。
创建了新的线程后,线程开始启动执行,如果在dwCreationFlags中用了CREATE_SUSPENDED特性,那么线程并不马上执行,而是先挂起,等到调用ResumeThread后才开始启动线程,在这过程中可以调用函数
BOOL SetThreadPriority( HANDLE hThread, int nPriority);
设置线程的优先权。
当线程的函数返回后,线程自动终止,如果要想在线程的执行过程中终止的话,可以调用函数
VOID ExitThread( DWORD dwExitCode);
如果在线程的外面终止线程的话,可以用下面的函数
BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode );
但注意,该函数可能会引起系统不稳定,而且,线程所占用的资源也不释放,因此,一般情况下,建议不要使用该函数。
如果要终止的线程是进程内的最后一个线程的话,在线程被终止后,相应的进程也终止。
2. 无优先级例程,该例程实现在对话框上通过一线程实现时钟的显示和停止。步骤如下:
第一步:建立一基于对话框的工程MultiProcess1。
第二步:在对话框上建立两个按钮和一个编辑框,ID号分别为ID_START、ID_STOP和IDC_TIME,Caption分别为"启动"、"停止"。如下:
第三步:在MultiProcess1Dlg.cpp中定义全局函数ThreadProc(),格式如下:
void ThreadProc()
{
CTime time;
CString m_time;
for(;;)
{
time=CTime::GetCurrentTime();
m_time=time.Format("%H:%M:%S");
::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_TIME,m_time);
Sleep(1000);
}
}
第四步:在头文件MultiProcess1Dlg.h中定义变量如下:
DWORD ThreadID;
HANDLE hThread;
第五步:双击"开始"按钮,生成消息映射函数OnStart(),编写其中的代码如下:
void CMultiProcess1Dlg::OnStart()
{
// TODO: Add your control notification handler code here
hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc,
NULL,0,&ThreadID);
}
此时即刻实现在对话框上点击"启动",启动时钟。接下来我们实现如何让时钟停下来。
第六步:双击"停止"按钮,添加停止的消息映射函数OnStop(),编写代码如下:
void CMultiProcess1Dlg::OnStop()
{
// TODO: Add your control notification handler code here
TerminateThread(hThread,1);
}
注意:该函数可能会引起系统不稳定,而且,线程所占用的资源也不释放,因此,一般情况下,建议不要使用该函数。
到现在,这个程序就完整了,看一下效果吧!
最后需要说明的是,并不是设计多线程就是一个好的程序。目前大多数的计算机都是单处理器(CPU)的,在这种机器上运行多线程程序,有时反而会降低系统性能,如果两个非常活跃的线程为了抢夺对CPU的控制权,在线程切换时会消耗很多的CPU资源,但对于大部分时间被阻塞的线程(例如等待文件 I/O 操作),可以用一个单独的线程来完成,这样可把CPU时间让出来,使程序获得更好的性能。因此,在设计多线程应用时,需要慎重选择,具体情况具体处理,以使应用程序获得最佳的性能。
- 上一篇:Windows平台下的多线程编程
- 下一篇:利用Visual C++设置桌面墙纸