c++多线程 基于对话框创建个时钟

来源:互联网 发布:淘宝图片尺寸和像素 编辑:程序博客网 时间:2024/06/17 01:44

多线程的简介

线程---操作系统调度的最小单位。线程包含在进程中,是进程中实际运行的单位。一个进程中可以同时运行多个线程,每个线程可以执行不同的任务,这就是所谓的多线程。同一进程中的多个线程将共享该进程中的全部系统资源,如虚拟地址空间、文件描述符和信号处理等,但是同一个进程中的多个线程都有各自的调用栈、寄存器环境和线程本地存储。

       对于单核(单CPU)系统来说,即便处理器一次只能运行一个线程,但是操作系统通过时间片轮转技术,在不同的线程之间进行切换,让用户产生可以同时处理多个任务的错觉,这样的程序运行机制称为软件的多线程。

       对于多核(多个CPU)系统来说,这样的系统能同时进行真正的多线程多任务处理。这种运行机制可以称为硬件的多线程技术。

       多线程程序作为一种多任务、并发的工作方式,当然有以下的优点:
  1) 提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线程,可以避免这种尴尬的情况。
  2) 使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。
  3) 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。

多线程编程实例1

       说明:本系列所有的实例都是在vc6.0下实现的,并且都是基于MFC AppWizard[exe]工程创建的“Dialog based”应用程序。

       实例1,简单的多线程,实现动态显示时间

工程名称为Mthread1,首先在Mthread1Dlg.h中声明线程函数---void ThreadProc(),此函数为全局函数。

       部分代码如下:

[cpp] view plaincopy
  1. // Mthread1Dlg.h : header file  
  2. //  
  3.    ... ...  
  4.   
  5. void ThreadProc();//线程函数声明  
  6. class CMthread1Dlg : public CDialog  
  7. {  
  8.      ... ...  
  9. protected:  
  10.     HICON m_hIcon;  
  11.     HANDLE hThread;//线程句柄  
  12.     ... ...  
  13.   
  14.     DECLARE_MESSAGE_MAP()  
  15. };  

MthreadDlg.cpp

[cpp] view plaincopy
  1. // Mthread1Dlg.cpp : implementation file  
  2. //  
  3.   
  4. /////////////////////////////////////////////////////////////////////////////  
  5. // CAboutDlg dialog used for App About  
  6. volatile BOOL m_bRun;//代表线程是否正常运行  
  7.   
  8. void ThreadProc() //线程函数  
  9. {  
  10.     CTime time;  
  11.     CString strTime;  
  12.     m_bRun = TRUE;  
  13.   
  14.     while(m_bRun)  
  15.     {  
  16.         time = CTime::GetCurrentTime();  
  17.         strTime = time.Format("%H:%M:%S");  
  18.   
  19.         ::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_TIME,strTime);  
  20.         Sleep(1000);  
  21.     }  
  22. }  
  23. class CAboutDlg : public CDialog  
  24. {  
  25.    ...  ...  
  26. void CMthread1Dlg::OnStart()     
  27. {  
  28.     // TODO: Add your control notification handler code here  
  29.     hThread = CreateThread(  
  30.                  NULL,                                   // SD  
  31.                  0,                                  // initial stack size  
  32.                 (LPTHREAD_START_ROUTINE)ThreadProc,    // thread function  
  33.                 NULL,                                    // thread argument  
  34.                 0,                                   // creation option  
  35.                  &threadID                               // thread identifier  
  36.                 );  
  37.     GetDlgItem(IDC_START)->EnableWindow(FALSE);  
  38.     GetDlgItem(IDC_STOP)->EnableWindow(TRUE);  
  39. }     
  40.   
  41. void CMthread1Dlg::OnStop()   
  42. {  
  43.     // TODO: Add your control notification handler code here  
  44.     m_bRun = FALSE;  
  45.     GetDlgItem(IDC_START)->EnableWindow(TRUE);  
  46.     GetDlgItem(IDC_STOP)->EnableWindow(FALSE);  
  47. }  

执行结果:


相应函数API说明

CreateThread

函数原型:

[cpp] view plaincopy
  1. HANDLE CreateThread(  
  2.  LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD  
  3.  DWORD dwStackSize,                       // initial stack size  
  4.  LPTHREAD_START_ROUTINE lpStartAddress,   // thread function  
  5.  LPVOID lpParameter,                      // thread argument  
  6.  DWORD dwCreationFlags,                   // creation option  
  7.  LPDWORD lpThreadId                       // thread identifier  
  8. );  
此函数在其调用进程的进程空间里创建一个线程。

参数说明:

lpThreadAttributes:指向SECURITY_ATTRIBUTES结构体,该结构体决定了函数返回句柄是否被子进线程继承。

如果为NULL,则不能被继承。

dwStackSize:指定了线程的堆栈大小,一般为0,使用默认的堆栈大小。

lpStartAddress:指向应用定义的线程函数,线程函数类型为LPTHREAD_START_ROUTINE。此值代表线程的开始地址。

lpParameter:线程函数所带的参数。是一个指向结构的指针,不需传递参数时,为NULL。

dwCreateFlags:线程标志。如果指定为CREATE_SUSPENDED,线程创建的时候的状态为挂起状态,

线程不会立即执行直到调用ResumeThread函数。

如果值为0,线程会立即执行。

lpThreadId:保存新线程的id.


代码下载地址:

http://download.csdn.net/detail/richerg85/4209126

0 0
原创粉丝点击