MFC线程创建----工作线程
时间:2010-07-15 来源:chen_yu_hust
Win32线程有两种,一是工作线程,就是只有一个线程函数的线程;二是UI线程,就是可以有用户界面的线程。两种线程在本质上一样的,因为windows在创建线程时都是使用的CreateThread函数,在C++中又把它封装成了_beginthread(ex),并为新线程维护了一个消息队列。
在MFC中,使用函数AfxBeginThread创建线程,该函数有两个版本,
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 );
前者用于创建工作线程,后者用于创建UI线程.
工作线程:
在VC下创建一下win32 console 工程,并添加如下代码:
#include <process.h>
#include <afxwin.h>
UINT WINAPI MyThreadProc(LPVOID pParam)
{
MessageBox(NULL,"MyThreadProc","ThreadTour",MB_OK);
return 1;
}
int main(int argc, char *argv[])
{
CWinThread *pThread = AfxBeginThread((AFX_THREADPROC)MyThreadProc,NULL);
WaitForSingleObject(pThread->m_hThread,INFINITE);
return 1;
}
编辑出下如下错误:
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
解决方法:
这是因为MFC要使用多线程时库, 需要更改设置:
[Project] --> [Settings] --> 选择"C/C++"属性页,
在Category中选择Code Generation,
再在Use run-time library中选择Debug Multithreaded或者multithreaded
其中
Single-Threaded 单线程静态链接库(release版本)
Multithreaded 多线程静态链接库(release版本)
multithreaded DLL 多线程动态链接库(release版本)
Debug Single-Threaded 单线程静态链接库(debug版本)
Debug Multithreaded 多线程静态链接库(debug版本)
Debug Multithreaded DLL 多线程动态链接库(debug版本)
单线程: 不需要多线程调用时, 多用在DOS环境下
多线程: 可以并发运行
静态库: 直接将库与程序Link, 可以脱离MFC库运行
动态库: 需要相应的DLL动态库, 程序才能运行
release版本: 正式发布时使用
debug版本: 调试阶段使用
问题即解决!