问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

mfc创建线程的三种方法

发布网友 发布时间:2022-04-23 15:03

我来回答

1个回答

热心网友 时间:2023-10-05 16:02

MFC中有两类线程,分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。
  工作者线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等。用户界面线程一般用于处理独立于其他线程执行之外的用户输入,响应用户及系统所产生的事件和消息等。但对于Win32的API编程而言,这两种线程是没有区别的,它们都只需线程的启动地址即可启动线程来执行任务

1、WIN的API函数CreateThread

HANDLE CreateThread(
LPSECURITY_ATTRIBUTESlpThreadAttributes, // SD
DWORDdwStackSize, // initial stack size
LPTHREAD_START_ROUTINElpStartAddress, // thread function
LPVOIDlpParameter, // thread argument
DWORDdwCreationFlags, // creation option
LPDWORDlpThreadId // thread identifier
);
//lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL,表示使用缺省值。

dwStackSize,线程堆栈大小,一般=0,在任何情况下,Windows根据需要动态延长堆栈的大小。

lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有*,但是必须以下列形式声明:

DWORD WINAPI ThreadProc (LPVOID lpParam) ,格式不正确将无法调用成功。

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

dwCreationFlags :线程标志,可取值如下

(1)CREATE_SUSPENDED-----创建一个挂起的线程,

(2)0---------------------------------表示创建后立即激活。

lpThreadId:保存新线程的id。

2、MFC的全局函数AfxBeginThread

CWinThread* AfxBeginThread( AFX_THREADPROCpfnThreadProc, LPVOIDpParam, intnPriority= THREAD_PRIORITY_NORMAL, UINTnStackSize= 0, DWORDdwCreateFlags= 0, LPSECURITY_ATTRIBUTESlpSecurityAttrs= NULL );

//用于创建工作者线程 其中pfnThreadProc指向线程函数 pParam为传递给线程函数的参数

CWinThread* AfxBeginThread( CRuntimeClass*pThreadClass, intnPriority= THREAD_PRIORITY_NORMAL, UINTnStackSize= 0, DWORDdwCreateFlags= 0, LPSECURITY_ATTRIBUTESlpSecurityAttrs= NULL );

//用于创建用户界面线程 其中pThreadClass为CWinThread派生对象的RUNTIME_CLASS

3、MFC的CWinThread类的CreateThreat成员函数

BOOL CreateThread( DWORD dwCreateFlags = 0, UINT nStackSize = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );

//CWinThread类支持工作者线程和用户界面线程 可以将一个CWinThread派生类的CRUNTIMECLASS的指针作为参数传递给AfxBeginThread函数以创建一个用户界面线程 CWinThread类的CreateThread成员函数创建一个调用进程的地址空间中执行的线程

VC 6.0 创建线程的三种方法

CreateThread/ExitThread
_beginthreadex/_endthreadex
AfxBeginThread /AfxEndThread

对以上三种方式的选择:

1.在使用了MFC的程序中使用AfxBeginThread函数或者CWinThread::CreateThread函数创建线程。

2.在非MFC工程中,如果要创建多线程,建议使用_beginthreadex

3.避免使用CreateThread函数。不使用_beginthread.

4.线程内部退出函数使用与创建函数配套的函数。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
问:和面面粉的发酵,常用哪些类似于食品添加剂一样的东西使面粉... 高数 求广义积分的值 ∫(0,∞)(arctan πx-arctan x)/xdx求解答!!给具体过程 ...1+x^2)^2/3] dx 这个表达式的反常积分怎么求啊 (0->+&)积分限... 地方专项计划和地方农村专项计划有何区别? 地方专项与农村专项的区别 烤箱如何烤豆子 电烤箱烤豆而是多久 电烤箱烤豆需要多长时间。 存钱什么宝 微信余额宝叫什么 快手一直不涨粉丝怎么办? ...绑定我的手机号买的东西没有了购物车也空了花呗也没有了怎么... 求问,微信怎样才能涨粉 微信公众号如何去运营才能达到增加曝光的效果的呢 新浪微博小号怎么帮大号涨粉 电脑企业微信输入法用不了 联想笔记本登录微信账号点密码没有输入法是怎么回事? 微信键盘上的微脉输入法怎么不见了? 如何恢复微信的输入法 什么是云计算,有嘛作用? 云计算有什么特性? 如何理解云服务器在时间和空间这两个维度上实现的按需部署?_百度问一问 移动大王卡注销? 移动大王卡能在手机上注销吗 客服说要下年四月底才能注销 能强行注销吗? 移动大王卡会自动注销吗 我有一张移动大王卡,已经两月没用了。能不能等第三个月之后自动销户。 移动大王卡 移动大王卡3个月不欠话费会自动注销吗 移动大王卡申请后多久可以注销 如何将移动大王卡用户注销,我已经用了3个月了,求解答,谢谢! 什么是蛋白 蛋白是什么 c语言中怎样创建多线程? 蛋白和蛋白质有区别吗? 如何建立一个工作线程,实现这样的功能(一个 蛋白和蛋白质的区别是什么? Qt如何进行创建多线程 蛋白 是什么意思? 如何使用 Visual C#创建线程 Java多线程之如何创建多线程 蛋白质的种类有哪几种? mfc中如何创建线程 vb.net 怎么新建线程 蛋白和蛋白质有区别吗?哪个好? MFC多线程主线程和新建线程执行关系 在一个线程中可以在创建线程或进程吗 蛋白质是什么东西啊 linux下main()中新建一个线程,延时问题? c语言中怎样创建多线程。最好有一个例子,谢谢!! thread new thread 怎么创建很多线程