Chinaunix首页 | 论坛 | 博客
  • 博客访问: 38032
  • 博文数量: 12
  • 博客积分: 560
  • 博客等级: 中士
  • 技术积分: 150
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-14 15:26
文章分类

全部博文(12)

文章存档

2010年(12)

我的朋友

分类: C/C++

2010-07-15 15:35:51

        Win32线程有两种,一是工作线程,就是只有一个线程函数的线程;二是UI线程,就是可以有用户界面的线程。两种线程在本质上一样的,因为windows在创建线程时都是使用的CreateThread函数,在C++中又把它封装成了_beginthreadex),并为新线程维护了一个消息队列。

    

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
#include
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版本: 调试阶段使用    

 

问题即解决! 

 

阅读(9931) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~