MFC多线程之工作者线程
2014-09-04 10:21
183 查看
1、关于工作者线程和用户界面线程的区别不再累述,主要是有无消息循环的区别。
2、下面通过一个基于对话框的工程来实现一个工作者线程。
3、AfxBeginThread函数(MSDN):
AfxBeginThread creates a new CWinThread object, calls its
CreateThread function to start executing the thread, and returns a pointer to the thread. Checks are made throughout the procedure to make sure all objects are deallocated properly should any part of the creation
fail. To end the thread, call AfxEndThread from within the thread, or return from the controlling function of the worker thread.
pThreadClass The RUNTIME_CLASS of an object derived from CWinThread.
pParam Parameter to be passed to the controlling function as shown in the parameter to the function declaration in
pfnThreadProc. nPriority The desired priority of the thread. If 0, the same priority as the creating thread will be used. For a full list and description of the available priorities, see
SetThreadPriority. nStackSize Specifies the size in bytes of the stack for the new thread. If 0, the stack size defaults to the same size stack as the creating thread.
dwCreateFlags Specifies an additional flag that controls the creation of the thread. This flag can contain one of two values:
CREATE_SUSPENDED Start the thread with a suspend count of one. Use
CREATE_SUSPENDED if you want to initialize any member data of the
CWinThread object, such as m_bAutoDelete or any members of your derived class, before the thread starts running. Once your initialization is complete, use the
CWinThread::ResumeThread to start the thread running. The thread will not execute until
CWinThread::ResumeThread is called.
0 Start the thread immediately after creation.
lpSecurityAttrs Points to a SECURITY_ATTRIBUTES structure that specifies the security attributes for the thread. If
NULL, the same security attributes as the creating thread will be used. For more information on this structure, see the
Platform SDK.
Header file: Declared in Afxwin.h
Platform: H/PC Pro, Palms-size PC, Pocket PC
4、在对话框上添加一个按钮,双击添加响应函数:
5、实现workerThreadFunc函数:
(1)全局函数:
(2)静态的成员函数:
6、运行后点击按钮弹处一个对话框,显示New Worker Thread!
7、OK,这样就创建了一个简单的线程了。
8、线程的挂起:CREATE_SUSPENDED
9、修改函数参数:
此时,运行程序单击按钮,会发现“New Worker Thread!”对话框没有出来,因为这个线程被挂起了。
10、添加一个成员变量,用于保存新建线程的句柄,根据这个句柄可以使挂起线程继续运行:
11、添加一个按钮,用于继续运行挂起的线程:
12、此时,依次点击两个按钮,依旧会弹出“New
Worker Thread!”对话框。
13、当然也可以根据线程句柄再次挂起线程:
14、退出线程函数:AfxEndThread()
或 ExitThread(0),必须在线程函数中调用:
Must be called from within the thread to be terminated.
15、调用如下:
2、下面通过一个基于对话框的工程来实现一个工作者线程。
3、AfxBeginThread函数(MSDN):
AfxBeginThread
This function creates a new thread. The first form of AfxBeginThread creates a worker thread. The second form creates a user-interface thread.AfxBeginThread creates a new CWinThread object, calls its
CreateThread function to start executing the thread, and returns a pointer to the thread. Checks are made throughout the procedure to make sure all objects are deallocated properly should any part of the creation
fail. To end the thread, call AfxEndThread from within the thread, or return from the controlling function of the worker thread.
CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL ); CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );
Parameters
pfnThreadProc Points to the controlling function for the worker thread. Cannot be NULL. This function must be declared as follows:UINT MyControllingFunction( LPVOID pParam );
pThreadClass The RUNTIME_CLASS of an object derived from CWinThread.
pParam Parameter to be passed to the controlling function as shown in the parameter to the function declaration in
pfnThreadProc. nPriority The desired priority of the thread. If 0, the same priority as the creating thread will be used. For a full list and description of the available priorities, see
SetThreadPriority. nStackSize Specifies the size in bytes of the stack for the new thread. If 0, the stack size defaults to the same size stack as the creating thread.
dwCreateFlags Specifies an additional flag that controls the creation of the thread. This flag can contain one of two values:
CREATE_SUSPENDED Start the thread with a suspend count of one. Use
CREATE_SUSPENDED if you want to initialize any member data of the
CWinThread object, such as m_bAutoDelete or any members of your derived class, before the thread starts running. Once your initialization is complete, use the
CWinThread::ResumeThread to start the thread running. The thread will not execute until
CWinThread::ResumeThread is called.
0 Start the thread immediately after creation.
lpSecurityAttrs Points to a SECURITY_ATTRIBUTES structure that specifies the security attributes for the thread. If
NULL, the same security attributes as the creating thread will be used. For more information on this structure, see the
Platform SDK.
Return Value
Pointer to the newly created thread object.Requirements
Windows CE versions: 2.0 and laterHeader file: Declared in Afxwin.h
Platform: H/PC Pro, Palms-size PC, Pocket PC
4、在对话框上添加一个按钮,双击添加响应函数:
void CMFC_ThreadDlg::OnBnClickedBtnWorker() { // TODO: 在此添加控件通知处理程序代码 AfxBeginThread(workerThreadFunc, NULL); }
5、实现workerThreadFunc函数:
(1)全局函数:
UINT workerThreadFunc(LPVOID pParam);
UINT workerThreadFunc(LPVOID pParam) { AfxMessageBox(_T("New Worker Thread!")); return 1; }
(2)静态的成员函数:
static UINT workerThreadFunc(LPVOID pParam);
UINT CMFC_ThreadDlg::workerThreadFunc(LPVOID pParam) { AfxMessageBox(_T("New Worker Thread!")); return 1; }
6、运行后点击按钮弹处一个对话框,显示New Worker Thread!
7、OK,这样就创建了一个简单的线程了。
8、线程的挂起:CREATE_SUSPENDED
9、修改函数参数:
void CMFC_ThreadDlg::OnBnClickedBtnWorker() { // TODO: 在此添加控件通知处理程序代码 AfxBeginThread(workerThreadFunc, NULL, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); }
此时,运行程序单击按钮,会发现“New Worker Thread!”对话框没有出来,因为这个线程被挂起了。
10、添加一个成员变量,用于保存新建线程的句柄,根据这个句柄可以使挂起线程继续运行:
CWinThread *pThread;将其初始化为NULL:
CMFC_ThreadDlg::CMFC_ThreadDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CMFC_ThreadDlg::IDD, pParent) , pThread(NULL) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); }保存线程句柄:
void CMFC_ThreadDlg::OnBnClickedBtnWorker() { // TODO: 在此添加控件通知处理程序代码 pThread = AfxBeginThread(workerThreadFunc, NULL, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); }
11、添加一个按钮,用于继续运行挂起的线程:
void CMFC_ThreadDlg::OnBnClickedBtnResumethread() { // TODO: 在此添加控件通知处理程序代码 if (pThread != NULL) { pThread->ResumeThread(); } }
12、此时,依次点击两个按钮,依旧会弹出“New
Worker Thread!”对话框。
13、当然也可以根据线程句柄再次挂起线程:
<span style="font-size:18px;">void CMFC_ThreadDlg::OnBnClickedBtnSuspendthread() { // TODO: 在此添加控件通知处理程序代码 if (pThread != NULL) { pThread->SuspendThread(); } }</span>
14、退出线程函数:AfxEndThread()
或 ExitThread(0),必须在线程函数中调用:
AfxEndThread
This function terminates the currently executing thread.Must be called from within the thread to be terminated.
void AFXAPI AfxEndThread( UINT nExitCode, BOOL bDelete = TRUE );
Parameters
nExitCode Specifies the exit code of the thread. bDelete Deletes the thread object from memory.15、调用如下:
UINT CMFC_ThreadDlg::workerThreadFunc(LPVOID pParam) { AfxMessageBox(_T("New Worker Thread!")); AfxEndThread(0); return 1; }
相关文章推荐
- 多线程编程学习3——使用MFC工作者线程
- VS2010/MFC入门编程十七(多线程的创建,包括工作线程和用户界面线程)
- 多线程专题之MFC创建线程(2)
- MFC多线程的创建,包括工作线程和用户界面线程
- MFC多线程编码--用户界面线程(四)
- MFC中工作者线程调用状态栏,死掉原因
- MFC多线程的创建,包括工作线程和用户界面线程
- MFC 界面线程和工作者线程
- MFC 多线程 用户界面线程创建
- MFC多线程编程之四——线程的同步
- 深入浅出Win32多线程设计之MFC的多线程-线程与消息队列(经典)
- 多线程编程之创建工作者线程
- MFC中创建多线程 MFC对象指针不能在线程间传输
- 深入浅出Win32多线程设计之MFC的多线程-线程与消息队列(经典)
- MFC多线程各种线程用法
- 用 MFC 类库编程实现工作者线程
- <MFC笔记>多线程编程之线程的特性
- MFC创建工作者线程
- 多线程之创建工作者线程和用户界面线程区别
- mfc多线程编程之三——线程间通讯