关于关闭线程的问题??(100分)

  • 主题发起人 主题发起人 wab
  • 开始时间 开始时间
W

wab

Unregistered / Unconfirmed
GUEST, unregistred user!
我在输入数据的表单中创建一个线程(TThread)来读取串口数据,
而且线程中通过一个串口控件来访问。我在表单的CloseQuery中
关闭线程(TThread).可就是老是会出现"OS功能调用错误"
在关闭表单前先手动关闭线程,就没事.
我看到瑞星还有其它一些杀毒软件,在查毒时若直接单击关闭按钮,
它就会提示你先停止查毒,不知它们是什么原因?
欢迎发炎!!!!在线灌注!!!
 
不知道你的线程的处理方式,我觉得关键是理清先后关系,避免冲突,应该没有什么大问题
至于瑞星,可能是在关闭程序前,需要先关闭查毒的线程吧
 
是这样的,我的线程是用来读卡的,在Execute 中引用一个串口通信控件来读取,
通信方法是那种不断发送标识符后再接收,而与此同时界面上又允许用户输入其它数据,
所以必须用一个线程来处理读卡。
现在问题应该是TThread的Terminate方法执行时只作了一个标识,实际上线程还没有关闭。
有没有其它方法,各位帮忙想想办法:(
 
你在窗体关闭的时候,将线程中断就是了
我就是这样,窗体打开的时候create线程,关闭的时候同时也关闭线程的
没有出现问题。
 
在你的TThread对象的构造函数里加上:
FreeOnTerminate := true;
函数在执行完毕时会自动销毁。
如果你关闭的窗体是主窗体,关闭后程序就会结束,那么尝试一下:
TerminateThread(MyThread.Handle, 0);
但如果不是主窗体,请谨用之,它将导致线程打开的资源不能被释放。
 
重点是我在Execute中引用线程容器对象中的串口通信对象,并且执行的过程比较长..
 
我做过类似的程序,通过串口不断的等待数据输入(随时可能有数据),我采用的方法是在
程序启动时创建线程,在线程的execute中让线程处于死循环,不断的等待输入数据,并对
数据进行相应的处理,在程序中止时才关闭线程,也就是说在程序运行时,线程是一直存在
的(当然要加一些处理,防止占用内存太大),效果还可以,也许对你有所帮助。
 
to resun:
对,就是你说的那种,能给我发一份代码吗??wabemail@263.sina.com
(附:因为错误不是一定出现,偶尔出现一下,
所以我到现在还没找出原因,惭愧!!)
 
说实话,我不太想给你,因为这是我为公司做的一个程序,这样吧,我去掉一些东东后,再
给你发过去
 
TThread的Terminate方法确实只做了一个标识,看看delphi的帮助吧:
Signals the thread to terminate by setting the Terminated property to True.
procedure Terminate;
Description
Terminate sets the thread's Terminated property to True, signaling that the thread should be terminated as soon as possible. Unlike the Windows API TerminateThread, which forces the thread to terminate immediately, the Terminate method merely requests that the thread terminate. This allows the thread to perform any cleanup before it shutsdo
wn.
For Terminate to work, the thread's Execute method and any methods that Execute calls should check Terminated periodically and exit when it's True.
翻译成汉语就是:Terminate方法只是设置TThread实例的Terminated属性为True,以此来通知线程应该结束了。Windows API TerminateThread是立即强行终结线程,而Terminate方法只是温和地请求线程终止。这使得线程在终止前可以做一些清理工作。
如果要让Terminate方法生效,TThread实例的 Execute 方法必须周期性地检查Terminated属性,当发现为True的时候则退出。
 
一般在线程的Execute函数中会有循环,那么只要在循环中加上一句
if Terminated then
exit;
就可以了。这样当别的地方调用了这个线程的Terminate方法后,最多
等一个循环的时间,你的线程就会发现它该结束了,于是退出。
 
to resun or wab:
可以给我发一份源代码吗
weiowen@cmmail.com
 
后退
顶部