MFC创建多线程实例





    平时在MFC里使用多线程时其实是很方面的,因为微软提供了一个API让我们很方面的去创建线程:下面是MSDN中关于CreateThread的函数原型:

1、函数原型声明:

  1. CreateThread  
  2.   
  3. The CreateThread function creates a thread to execute within the virtual address space of the calling process.  
  4.   
  5. To create a thread that runs in the virtual address space of another process, use the CreateRemoteThread function.  
  6.   
  7.   
  8. HANDLE CreateThread(  
  9.   LPSECURITY_ATTRIBUTES lpThreadAttributes,  
  10.   SIZE_T dwStackSize,  
  11.   LPTHREAD_START_ROUTINE lpStartAddress,  
  12.   LPVOID lpParameter,  
  13.   DWORD dwCreationFlags,  
  14.   LPDWORD lpThreadId  
  15. );  
CreateThread The CreateThread function creates a thread to execute within the virtual address space of the calling process. To create a thread that runs in the virtual address space of another process, use the CreateRemoteThread function. HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId );

2、参数说明:

  1. lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL,表示使用缺省值。  
  2.   
  3.   
  4. dwStackSize,线程堆栈大小,一般=0,在任何情况下,Windows根据需要动态延长堆栈的大小。  
  5.   
  6.   
  7. lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:  
  8.   
  9.   
  10. DWORD WINAPI ThreadProc (LPVOID pParam) ,格式不正确将无法调用成功。   
  11.   
  12.   
  13. lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为Nil。   
  14.   
  15.   
  16. dwCreationFlags :线程标志,可取值如下   
  17.   
  18.   
  19. CREATE_SUSPENDED: 创建一个挂起的线程   
  20.   
  21.   
  22. 0 :创建后立即激活。   
  23.   
  24.   
  25. lpThreadId:保存新线程的id。  
  lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL,表示使用缺省值。   dwStackSize,线程堆栈大小,一般=0,在任何情况下,Windows根据需要动态延长堆栈的大小。   lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:   DWORD WINAPI ThreadProc (LPVOID pParam) ,格式不正确将无法调用成功。   lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为Nil。   dwCreationFlags :线程标志,可取值如下   CREATE_SUSPENDED: 创建一个挂起的线程   0 :创建后立即激活。   lpThreadId:保存新线程的id。

3、返回值:

  函数成功,返回线程句柄;函数失败返回false。

4、实例代码:

  A、新建一个对话框工程为MFC,在MFCDlg.h添加两个成员函数,注意一定要是静态的,代码如下:

  1. /////////////////////////////////////////////////////////////////////////////  
  2. // CMFCDlg dialog  
  3.   
  4. class CMFCDlg : public CDialog  
  5. {  
  6. // Construction  
  7. public:  
  8.     CMFCDlg(CWnd* pParent = NULL);  // standard constructor  
  9.   
  10.     // 线程B1、B2函数  
  11.     static DWORD WINAPI ThreadB1(LPVOID lpParam);  
  12.     static DWORD WINAPI ThreadB2(LPVOID lpParam);  
  13.   
  14.     ……  
  15. }  
///////////////////////////////////////////////////////////////////////////// // CMFCDlg dialog class CMFCDlg : public CDialog { // Construction public: CMFCDlg(CWnd* pParent = NULL); // standard constructor // 线程B1、B2函数 static DWORD WINAPI ThreadB1(LPVOID lpParam); static DWORD WINAPI ThreadB2(LPVOID lpParam); …… }

  B、在cpp文件中实现函数,添加代码如下:

  1. DWORD WINAPI CMFCDlg::ThreadB1(LPVOID lpParam)       
  2. {  
  3.     // 定义结构对象  
  4.     PROCESS_INFORMATION pi;  
  5.     STARTUPINFO         si;  
  6.     BOOL                bRet;  
  7.   
  8.     // 申请空间  
  9.     ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));  
  10.     ZeroMemory(&si,sizeof(STARTUPINFO));  
  11.       
  12.     // 设置进程启动属性  
  13.     si.cb           =   sizeof(STARTUPINFO);  
  14.     si.lpReserved   =   NULL;  
  15.     si.lpDesktop    =   NULL;  
  16.     si.lpTitle      =   NULL;  
  17.     si.dwFlags      =   STARTF_USESHOWWINDOW;  
  18.     si.wShowWindow  =   SW_SHOWNORMAL;  
  19.     si.cbReserved2  =   NULL;  
  20.     si.lpReserved2  =   NULL;  
  21.       
  22.     bRet = CreateProcess(_T(”C://Program Files//Internet Explorer//IEXPLORE.exe”),  
  23.                          _T(”http://www.coderfans.cn”),  
  24.                          NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);  
  25.     return 0;  
  26. }  
  27.   
  28. DWORD WINAPI CMFCDlg::ThreadB2(LPVOID lpParam)       
  29. {  
  30.     // 定义结构对象  
  31.     PROCESS_INFORMATION pi;  
  32.     STARTUPINFO         si;  
  33.     BOOL                bRet;  
  34.       
  35.     // 申请空间  
  36.     ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));  
  37.     ZeroMemory(&si,sizeof(STARTUPINFO));  
  38.       
  39.     // 设置进程启动属性  
  40.     si.cb           =   sizeof(STARTUPINFO);  
  41.     si.lpReserved   =   NULL;  
  42.     si.lpDesktop    =   NULL;  
  43.     si.lpTitle      =   NULL;  
  44.     si.dwFlags      =   STARTF_USESHOWWINDOW;  
  45.     si.wShowWindow  =   SW_SHOWNORMAL;  
  46.     si.cbReserved2  =   NULL;  
  47.     si.lpReserved2  =   NULL;  
  48.       
  49.     bRet = CreateProcess(_T(”C://Program Files//Internet Explorer//IEXPLORE.exe”),  
  50.                          _T(”http://blog.csdn.net/wangningyu”),  
  51.                          NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);  
  52.   
  53.     return 0;  
  54. }  
DWORD WINAPI CMFCDlg::ThreadB1(LPVOID lpParam) { // 定义结构对象 PROCESS_INFORMATION pi; STARTUPINFO si; BOOL bRet; // 申请空间 ZeroMemory(&pi,sizeof(PROCESS_INFORMATION)); ZeroMemory(&si,sizeof(STARTUPINFO)); // 设置进程启动属性 si.cb = sizeof(STARTUPINFO); si.lpReserved = NULL; si.lpDesktop = NULL; si.lpTitle = NULL; si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWNORMAL; si.cbReserved2 = NULL; si.lpReserved2 = NULL; bRet = CreateProcess(_T(“C://Program Files//Internet Explorer//IEXPLORE.exe”), _T(“http://www.coderfans.cn”), NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); return 0; } DWORD WINAPI CMFCDlg::ThreadB2(LPVOID lpParam) { // 定义结构对象 PROCESS_INFORMATION pi; STARTUPINFO si; BOOL bRet; // 申请空间 ZeroMemory(&pi,sizeof(PROCESS_INFORMATION)); ZeroMemory(&si,sizeof(STARTUPINFO)); // 设置进程启动属性 si.cb = sizeof(STARTUPINFO); si.lpReserved = NULL; si.lpDesktop = NULL; si.lpTitle = NULL; si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWNORMAL; si.cbReserved2 = NULL; si.lpReserved2 = NULL; bRet = CreateProcess(_T(“C://Program Files//Internet Explorer//IEXPLORE.exe”), _T(“http://blog.csdn.net/wangningyu”), NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); return 0; }

  C、然后在对话框初始化时创建进程即可,代码如下:

  1. BOOL CMFCDlg::OnInitDialog()  
  2. {  
  3.     CDialog::OnInitDialog();  
  4.     ……  
  5.   
  6.     // Set the icon for this dialog.  The framework does this automatically  
  7.     //  when the application’s main window is not a dialog  
  8.     SetIcon(m_hIcon, TRUE);         // Set big icon  
  9.     SetIcon(m_hIcon, FALSE);        // Set small icon  
  10.       
  11.     // TODO: Add extra initialization here  
  12.     DWORD   dw1,dw2;  
  13.     CreateThread(NULL,0,ThreadB1,NULL,0,&dw1);  
  14.     Sleep(100);  
  15.   
  16.     CreateThread(NULL,0,ThreadB2,NULL,0,&dw2);  
  17.     Sleep(100);  
  18.     return TRUE;  // return TRUE  unless you set the focus to a control  
  19. }  
BOOL CMFCDlg::OnInitDialog() { CDialog::OnInitDialog(); …… // Set the icon for this dialog. The framework does this automatically // when the application’s main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here DWORD dw1,dw2; CreateThread(NULL,0,ThreadB1,NULL,0,&dw1); Sleep(100); CreateThread(NULL,0,ThreadB2,NULL,0,&dw2); Sleep(100); return TRUE; // return TRUE unless you set the focus to a control }

5、MFC创建多线程完成,就这么简单咯!






猜你喜欢

转载自blog.csdn.net/u010440456/article/details/82684191