龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

例程分析多线程编程[图](2)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
参数dwCreationFlags指定了线程创建的特性; 参数 lpThreadId 指向一个DWORD变量,可返回线程ID值。 如果创建成功则返回线程的句柄,否则返回NULL。 创建了新的

  参数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时间让出来,使程序获得更好的性能。因此,在设计多线程应用时,需要慎重选择,具体情况具体处理,以使应用程序获得最佳的性能。

精彩图集

赞助商链接