中断线程的问题--急!(100分)

  • 主题发起人 主题发起人 rickyjia
  • 开始时间 开始时间
R

rickyjia

Unregistered / Unconfirmed
GUEST, unregistred user!
如下代码:
procedure TFilesUpload.btnCancelClick(Sender: TObject);
begin
bThreadFlag := False;
SetEvent(hEvent);
end;

procedure TFilesUpload.OnSendFile;
begin
hEvent := Windows.CreateEvent(nil, False, False, nil);
hThread := CreateThread(nil, 0, @SendFileByDataSteam,@ThreadParam,0,ThreadID);
repeat
begin
ret := MsgWaitForMultipleObjects(1, hEvent, False, INFINITE, QS_ALLINPUT);
Application.ProcessMessages;
if not bThreadFlag then
break;
end;
until(ret = WAIT_OBJECT_0);
CloseHandle(hEvent);
end;
点击取消按钮,发送一个消息给进程,想取消它,但是执行后报错,请问问题出现在哪里?
 
看了很久,实在是没看明白你的意思,sorry
 
我的意思是:我想中断一个正在运行的线程,不知如何实现
 
hThread.suspend ;
hThread.terminate;
即可
也一个让thread中的循环条件为假,线程函授退出
另外你Event的使用,写的狠没道理,当然我没看你全部代码,从你贴出来的部分看...
 
如果这里不用Event,那该如何?
ret := MsgWaitForMultipleObjects(1, hEvent, False, INFINITE, QS_ALLINPUT);
这里必须使用啊
 
确实看糊涂了。
如果你是要中断hThread := CreateThread(nil, 0, @SendFileByDataSteam,@ThreadParam,0,ThreadID);
这个线程的话,那MsgWaitForMultipleObjects应该是在SendFileByDataSteam这个方法里边
 
你搞错了吧,你应该贴出你execute函数的代码,比如:
procedure TCommThread.Execute;
var ...
begin
...
While ExistExecutedo
begin
try
...
except
...
end;
end;
...
end;
那么你一般只需要在外面:ExistExecute:=False;就可以了
 
要安全的终止线程,先要让线程的execute里面的处理执行完成。如果execute里的处理太多,可以在处理中间加入一些退出判断条件,当要终止线程时先使线程的退出条件成立,然后再执行终止线程的操作。
我一般是给线程加上一个过程
procedure TAThread.hangup;
begin
FHangup := True;
end;
procedure TAThread.Execute;
begin
...
if FHangup then
exit;
...
end;
终止线程之前先执行Hangup。
 
没看里面的代码,我有一个应用可能跟你差不多吧。
我是程序一运行就开一个线程,然后让这个线程运行。当我想停止这个线程的时候就用Terminated,不过在execute中,我用到了WaitForSingleObject这个来等待一个事件。当事件被激活后,线程就运行,同时ResetEvent该事件。这样就可以让线程按要求运行(可停,可走)
大概代码如下:
首先在线程的Create中用CreateEvent()创建一个事件hEvent,该函数中第二,三个参数分别为True,False.
其次,在线程的execute中
while not Terminateddo
begin
WaitForSingleObject(hEvent,INFINITE);
ResetEvent(hEvent);
//do something
if Terminated then
Break;
end;

大概是这样
 
想让这个线程运行时,就SetEvent(hEvent);不想让他运行时,不用干嘛。他就挂在那里了。
 
关键就是要贴出执行代码了,你只贴了设置事件的代码,这个不能分析出错在哪里!
 
现在的主要问题是:我的线程是由API产生的:hThread := CreateThread(nil, 0, @SendFileByDataSteam,@ThreadParam,0,ThreadID);如果要中断的话好像只有TerminateThread(hThread, ThreadID);这种方法,但是我查了一下资料,说这种方式不安全,容易引起内存泄漏.不知可有好的方法?
 
直接创建:
//启动线程
ComThread := TCommThread.create(True);
...//给参数赋值
ComThread.Resume;
 
直接用delphi的TThread类来派生一个子类
然后重载Execute方法就成了
干嘛自己写啊
 
问题是程序中已经写成这样了,不好修改;针对这种方法有没有好的解决啊.
 
我也遇到过类似的问题,用了suspend和free,一执行就出错,程序就死了
 
Delphi封装的那个Thread有时候 Terminate 也不灵光
还是TerminateThread直接,HAHA
 
问题是TerminateThread会造成内存泄漏,不是很安全,有好的方法吗?
 

Similar threads

后退
顶部