如何安全地在外部终止一个线程?

有一个线程(阻塞的)用来接收用户输入(外设)。在系统这边可能会取消这个接收输入的操作,取消的同时也需要终止这个线程。

作者: jy33888   发布时间: 2011-06-16

让线程等待在某个变量上,设置这个变量,让其退出
比如:
while(TRUE)
{
  if(!bRun)break;
  //
  //你的处理
}
控制bRun的值就可以安全的让线程退出

作者: shenyi0106   发布时间: 2011-06-16

http://tech.163.com/06/0206/10/29981T1S00091LRC.html

作者: hezhe1008   发布时间: 2011-06-16

终止其他线程只能TerminateThread。
不过要说安全,除非线程自己在线程函数中return,其他的方式都不能说是安全。

作者: kyotrue   发布时间: 2011-06-16

它是阻塞的 API来自另外一个DLL,现阶段无法改动,写不了循环,不能TerminateThread,因为有些资源无法释放

作者: jy33888   发布时间: 2011-06-16

让那个函数失败,然后判断函数返回值,退出线程

作者: shenyi0106   发布时间: 2011-06-16

就是那函数自己阻塞着 要等它返回

作者: jy33888   发布时间: 2011-06-16

引用 6 楼 jy33888 的回复:
就是那函数自己阻塞着 要等它返回

那么那个函数应该有某种情况下会返回吧?
那个函数也应该有某种情况下会返回错误吧?
判断返回值,错误就退出……

如果你不知道,那你应该去问问你的这个接口的提供者,问问上面两个问题

作者: shenyi0106   发布时间: 2011-06-16

它超时大概10几秒会返回,但是如果系统这边如果操作员开始了这个操作,又立刻想取消掉(可能是按错),那线程已经开启了,要立刻取消啊

作者: jy33888   发布时间: 2011-06-16

除了超时和正常返回外,难道就没有其他情况下的返回?

作者: shenyi0106   发布时间: 2011-06-16

没有T_T

作者: jy33888   发布时间: 2011-06-16

函数不是你写的,你又不想按照别人写的意思返回,你只能TerminateThread,或者当用户点击“取消”时弹出个等待对话框,函数返回后用户才能操作!

作者: flydreamGG   发布时间: 2011-06-16

就是因为不开线程 直接调用会阻塞界面 才要这样做

作者: jy33888   发布时间: 2011-06-16

我只能说那个dll写的不好

作者: hustlaofan   发布时间: 2011-06-16

不好也没办法 现在没得改。。。 所以我想寻求其他的解决方法

作者: jy33888   发布时间: 2011-06-16

没撤,强制吧

作者: shenyi0106   发布时间: 2011-06-16

正常返回时,有没有什么不用的返回值?

作者: shenyi0106   发布时间: 2011-06-16

比如说:
接收字符的函数,正常情况下只要键盘输入都会返回,但是由于程序中只处理了小写字母,那么大写字母就没有用了,可以将大写字母作为错误返回的标记。
LZ明白了没?

作者: shenyi0106   发布时间: 2011-06-16

那个外设是只有数字键那种

作者: jy33888   发布时间: 2011-06-16

引用 18 楼 jy33888 的回复:
那个外设是只有数字键那种

我上面说的只是个例子啊,不要就把自己带进去了,晕!!!

数字键中的0~9都用了?考虑同事按下多个键的状态了没?
如果实在不行,你就强制吧,没撤了………………

作者: shenyi0106   发布时间: 2011-06-16

是系统这边要断开跟设备的这个IO操作 不是从设备那边取消 假如设备那边没人输入 我不是一样要取消吗? 系统这边要可以随时随地的取消操作并终止线程,而且要正确释放资源

作者: jy33888   发布时间: 2011-06-16

假如它是异步IO 那么就没问题了 ,问题它是阻塞的

作者: jy33888   发布时间: 2011-06-16

哎……
我没撤了……,
最后一个办法,把你的这个线程中要用到底资源,在开线程前都分配好,在开线程,强制终止线程后,在释放这些资源,
Good Luck!!

作者: shenyi0106   发布时间: 2011-06-16

它内部打开了个串口,强制了,串口没关闭(句柄没释放),再进行这个操作,串口就会初始化失败。还有线程的堆栈也没有释放。

作者: jy33888   发布时间: 2011-06-16

把写DLL的那个人叫过来,让他重写,写成异步的,最后请他吃顿饭,搞定!

作者: yao050421103   发布时间: 2011-06-16

ls好方法:)

作者: jy33888   发布时间: 2011-06-16

让你的这个线程截取消息,要停的时候向这个线程发一个线程消息,然后本线程自己退出,并做相应处理。。。

作者: Bestrem_9   发布时间: 2011-06-16