博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MFC启动和关闭线程
阅读量:4920 次
发布时间:2019-06-11

本文共 1856 字,大约阅读时间需要 6 分钟。

1、 启动线程:

CWinThread* AfxBeginThread( 线程函数,this );

2、通常导致线程终止的两种情况是:控制函数退出或不允许线程完成运行。如果字处理器使用后台打印线程,若成功完成打印,则控制函数将正常终止。但是,如果用户要取消打印,后台打印线程则不得不提前终止。本主题介绍如何实现每一种情况,以及在终止后如何获取线程的退出代码。

(1)正常线程终止

对于辅助线程,正常线程终止很简单:退出控制函数并返回表示终止原因的值。可以使用 函数或 return 语句。一般情况下,0 表示成功完成,但这取决于您自己。

对于用户界面线程,该过程也很简单:从用户界面线程内调用 Platform SDK 中的 。PostQuitMessage 采用的唯一参数是线程的退出代码。对于辅助线程,0 通常表示成功完成。

(2)过早的线程终止

过早终止线程几乎一样简单:从线程内调用 。将所需的退出代码作为唯一参数传递。这将停止执行线程、解除对线程堆栈的分配、分离附加到线程的所有 DLL 并从内存中删除线程对象。

必须从要终止的线程内调用 AfxEndThread。如果要从其他线程终止线程,必须设置两个线程间的通信方法。

举一个例子:

可以创建一个信号量,用WaitForSingleObject函数来检测该信号量的状态。

成员变量 m_hThreadEvent;

m_hThreadEvent = CreateEvent( NULL, FALSE, FALSE, NULL );

线程的执行函数:

for( ; ;){            DWORD dwRetVal;    dwRetVal = WaitForSingleObject( m_hThreadEvent, 100 );    if ( dwRetVal == WAIT_TIMEOUT )    {        // TODO:    }    else    {        // stop receive text thread.        DWORD dwExitCode;        GetExitCodeThread( m_pThreadRecv->m_hThread, &dwExitCode );        AfxEndThread( dwExitCode, TRUE );    }}

要结束线程时,使用SetEvent,将信号量置为有信号。

该线程是在信号量有信号时,退出。

(3)TerminateThread

在CWinThread对象中有线程的句柄,可以使用该句柄强行杀死线程。但是不推荐使用这种方式,当可以正常结束的时候,选择前两种方法较好。

检索线程的退出代码

若要获取辅助线程或用户界面线程的退出代码,请调用 函数。有关此函数的信息,请参见 Platform SDK。此函数获取线程(存储在 CWinThread 对象的 m_hThread 数据成员中)的句柄和 DWORD 的地址。

如果线程仍然是活动的,GetExitCodeThread 将 STILL_ACTIVE 放置在提供的 DWORD 地址中;否则将退出代码放置在该地址中。

检索 对象的退出代码还需要一步。默认情况下,当 CWinThread 线程终止时,删除该线程对象。这意味着不能访问 m_hThread 数据成员,因为 CWinThread 对象不再存在。若要避免出现这种情况,请执行以下操作之一:

  • 将 m_bAutoDelete 数据成员设置为 FALSE。这使 CWinThread 对象在线程终止后仍可以继续存在。然后可以在线程终止后,访问 m_hThread 数据成员。但是,如果使用此方法,就得销毁 CWinThread 对象,因为框架不会自动删除该对象。这是首选方法。

  • 单独存储线程的句柄。创建线程后,(使用 ::DuplicateHandle)将其 m_hThread 数据成员复制到其他变量,并通过该变量访问该成员。这样,终止后即会自动删除对象,并且仍然可以找到线程终止的原因。请注意:在可以复制句柄之前,线程不终止。执行此操作的最安全的方式是将 CREATE_SUSPENDED 传递到 ,存储句柄,然后通过调用 继续执行线程。

任一方法都可以使您确定 CWinThread 对象终止的原因。

转载于:https://www.cnblogs.com/MrYuan/p/5238623.html

你可能感兴趣的文章
看看已堕落的自己
查看>>
JavaScript的namespace
查看>>
关于分区索引与全局索引性能比较的示例
查看>>
移动端软件盘遮挡输入框问题
查看>>
pycharm(Tip of Day)
查看>>
[FJOI2016]建筑师(斯特林数)
查看>>
将计算机思维故事化——之操作系统典型调度算法
查看>>
0831 模糊查询,排序查询,聚合函数,时间日期函数,数学函数,字符串函数
查看>>
hive学习3
查看>>
Ubuntu12.10 Server 安装 VirtualBox-4.2.6 (64位) 过程详解
查看>>
11.5 正睿停课训练 Day16
查看>>
随机点名
查看>>
rbac 权限分配, 基于formset实现,批量编辑
查看>>
Asp.Net Web API VS Asp.Net MVC
查看>>
静态邻接表
查看>>
npm安装时提示没读写权限
查看>>
我感觉我要把大佬气死了
查看>>
变量名动态命名和调用
查看>>
看数组中是否存在一个数字,以及输入函数
查看>>
MVC怎么在同一个action返回两个表的数据
查看>>