怎么在主线程中结束工作线程?

ussthamcn 2005-09-15 12:49:55
我用工作线程采集数据并把数据发送给主用户界面线程,当工作界面线程收到用户停止采集的消息时候要结束数据采集线程。这时候该怎么结束呢?用TerminateThread又得不到工作线程的线程ID,向线程法送一个消息来结束也的不到线程的ID.
...全文
371 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ussthamcn 2005-09-16
  • 打赏
  • 举报
回复
对的:),用WaitForSingleObject也可以定时.
newzk 2005-09-16
  • 打赏
  • 举报
回复
用WaitForSingleObject也可以定时啊,自我感觉楼主也想得过于复杂
ussthamcn 2005-09-16
  • 打赏
  • 举报
回复
工作线程不需要等待啊,WaitForSingleObject(g_bKillWorkThread,0)把等待超时设置为0就相当于判断一下.
while(WaitForSingleObject(g_bKillWorkThread,0) != WAIT_OBJECT_0)
{
Sleep(time);
g_Buffer = ReadFile(hCom, ...);
}
对我也觉得BOOL变量比较方便简单。
工作线程中定时除了Sleep()好像没有什么别的方法了,也不能SetTimer().
比如说我要20毫秒读一次串口只能
while(..)
{
Sleep(20);
ReadFile(hCom, ..);
}
有什么别的方法吗?
phoenix96_2000 2005-09-16
  • 打赏
  • 举报
回复
但是你的工作线程岂不就一直在等待是否改结束了??
当然如果加上等待超时也可以,那样还不如用Sleep

我还是觉得使用bool变量的方法比较简单,工作线程不干活的时候就Sleep一段时间,醒来就检查是否该退出, 不退出就干活..
while(!g_bAbort)
{
DoStuff();
Sleep(g_dwSleeptime);
}

ussthamcn 2005-09-16
  • 打赏
  • 举报
回复
如果不用全局事件对象用一个全局变量也是一样的.
g_bKillWorkThread.初始化为FALSE,如果收到用户结束工作线程的消息后就g_bKillWorkThread=TRUE
在工作者线程的线程函数的循环中加入while(g_bKillWorkThread==FALSE &&.....)来判断,如果循环结束函数就返回了,也就结束线程了.
ussthamcn 2005-09-16
  • 打赏
  • 举报
回复
可是AfxEndThread必须在工作者线程内调用才有效,而我的主要的问题就是在主线程中结束工作者线程。
我的工作者线程的线程函数有个循环不停的采集数据.如果主线程不让他停止他是不会退出的.(这也是合理的,停止数据采集应该有用户停止,用户把消息发给主用户界面线程,这时候用户界面线程来结束工作线程)

1.我在主线程中用TerminateThread(参数为创建线程AfxBeginThread 返回的线程对象的线程句柄成员)来牵制结束工作线程. 这种发放不可取了,最少不是很好的方法.

2.要么设置一个全局的事件对象g_hKillWorkThread,在采集的线程的线程函数的循环中检测这个事件对象,如果有信号就结束循环,线程也就结束结束了.)而主线程收到用户停止采集的消息后就SetEvent(g_hKillWorkThread).
我想是这样的,不知道大家是不是这么做的?或者还有什么别的方法.
angel_rabbit 2005-09-15
  • 打赏
  • 举报
回复
while一个循环,条件不满足时,让thread auto return 0L
pomelowu 2005-09-15
  • 打赏
  • 举报
回复
嗯。不是不得已的情况下不要用TerminateThread。
一般来说结束工作线程最直接的方式就是线程函数返回,上面 phoenix96_2000 也说到了。不过工作线程没有消息队列,不能发送线程消息。具体做法正如你所说,定义事件对象,工作线程的循环中WaitForSingleObject返回WAIT_OBJECT_0时让线程函数返回。这样在主线程中SetEvent(g_hKillWorkThread)就能结束工作线程。

或者还可以用AfxBeginThread相应的AfxEndThread函数结束
phoenix96_2000 2005-09-15
  • 打赏
  • 举报
回复
假设你的线程是那种循环中干活儿的那种..

在循环中加上g_hKillWorkThread的判断,如果是true就退出循环
ussthamcn 2005-09-15
  • 打赏
  • 举报
回复
我不是很明白你是什么意思。我猜是不是定义一个全局的事件对象如g_hKillWorkThread,g_hKillWorkThread在工作线程的的循环中条件中用WaitForSingleObject(g_hKillWorkThread, 0) == WAIT_OBJECT_0来结束工作线程的线程函数并返回.当主线程收到结束线程的命令的时候就把全局事件对象SetEvent(g_hKillWorkThread)结束
phoenix96_2000 2005-09-15
  • 打赏
  • 举报
回复
好的办法就是线程接收到退出消息,清理资源,然后退出(从线程函数返回)

比如,你如果是一个工作线程,
可以通过某个共享的变量(比如使用全局变量g_bAbort),

外界主线程中,退出前,把这个变量设置成为true,使用WaitForSingleObject等待线程结束
工作线程中检测到g_bAbort为true的时候,就清理,返回...
ussthamcn 2005-09-15
  • 打赏
  • 举报
回复
自己顶一下
ussthamcn 2005-09-15
  • 打赏
  • 举报
回复
谢谢,我用TerminateThread终止了,看了一下MSDN ,TerminateThread()很多弊端阿。TerminateThread is used to cause a thread to exit. When this occurs, the target thread has no chance to execute any user-mode code and its initial stack is not deallocated. DLLs attached to the thread are not notified that the thread is terminating.TerminateThread is a dangerous function that should only be used in the most extreme cases.
有什么好的方法终止线程吗?
ussthamcn 2005-09-15
  • 打赏
  • 举报
回复
对我用AfxBeginThread创建的线程。
weiym 2005-09-15
  • 打赏
  • 举报
回复
GetThreadId,TerminateThread
vcmute 2005-09-15
  • 打赏
  • 举报
回复
什么时候启动线程的时候获得线程ID
pomelowu 2005-09-15
  • 打赏
  • 举报
回复
你用什么创建的线程?MFC的CWinThread类?CWinThread::m_nThreadID就是啦。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧