一个多线程问题的讨论 ( 积分: 200 )

  • 主题发起人 主题发起人 haha2008haha
  • 开始时间 开始时间
H

haha2008haha

Unregistered / Unconfirmed
GUEST, unregistred user!
序结构如下 对象控制类 对象类 线程类 对象控制类负责多个对象的实例,而对象类里面则要执行某个复杂的操作,因为操作可能执行不成功或者很费时,所有在对象类里面放一个线程类实例,在线程中执行操作,一旦未执行成功也不退出,继续循环等待消息(关闭线程消息或者重新执行操作的消息)
现在问题出在程序关闭的时候,必须要关闭所有线程,如果未完全关闭则程序就根本无法关闭,而关闭线程可能很慢(关闭的时候还要执行一个操作,有的马上完成,有的则很慢),如果在窗口的Destroy事件中挨个关闭的话,程序就会执行很长时间。
跟踪发现对于线程类,执行 thread.terminal; thread.waitfor;后,在执行waitfor的时候,有些线程很长时间根本没有响应。
现在想使不是应该再新增一个关闭线程类,每个线程各自关闭一个线程,各线程同时执行,不用waitfor而采用定时,如果到时候某线程还未关闭,则强行terminalThread?
现在还有个问题,在未新增线程类之前,挨个关闭线程,也采用定时关闭的,如果规定时间内未关闭则直接terminalThread,但是全部执行完应用程序仍然无法关闭。
 
procedure FreeThread(_Thread: TThread);
var
i: Integer;
iExitCode: Cardinal;
begin
if not Assigned(_Thread) then
Exit;
iExitCode := 0;
with _Threaddo
try
FreeOnTerminate := False;
Terminate;
if Suspended then
Resume;
for i := 1 to 20do
begin
GetExitCodeThread(Handle, iExitCode);
if iExitCode = STILL_ACTIVE then
Sleep(100)
else
Break;
end;
finally
Free;
end;
end;
 
thread.free 和使用terminalteThread有区别么?
 
通常来说 TThread.Terminate;
TThread.WaitFor;是最正常的关闭方式。
如果因为界面问题,则可以专门定义一个清理线程来处理这些工作线程的关闭。
但最最关键的是,线程Terminate时无响应,是程序编写的问题,属于代码bug,要排除它,而不是绕开它。
最常见的问题是,在工作线程中因为Synchronize中要等待主线程,而主线程中又在waitfor或者工作线程在临界区中Synchronize,但主线程这时又在进入临界区,于是死锁了,请检查一下。
 
后退
顶部