AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

例程分析多线程编程

51自学网 2015-08-30 http://www.wanshiok.com

  下面举例说明在Win32 基础上进行多线程编程的过程。

  1.使用函数说明

  Win32函数库里提供了多线程控制的操作函数,包括创建线程、终止线程、建立互斥区等。首先,在应用程序的主线程或者其它活动线程的适当的地方创建新的线程,创建线程的函数如下:

  HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,

  DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress,

  LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId );

  参数lpThreadAttributes 指定了线程的安全属性,在Windows 95中被忽略;

  参数dwStackSize 指定了线程的堆栈深度;

  参数lpStartAddress 指定了线程的起始地址,一般情况为下面原型的函数

  DWORD WINAPI ThreadFunc( LPVOID );

  参数 lpParameter指定了线程执行时传送给线程的32位参数,即上面函数的参数;

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

 
 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。

上一篇:VC中利用ADO共同实现数据库的操作  下一篇:让ListBox控件支持拖动