关于多线程的结束(50分)

  • 主题发起人 主题发起人 coolingxyz
  • 开始时间 开始时间
C

coolingxyz

Unregistered / Unconfirmed
GUEST, unregistred user!
线程大致是这样的
constructor Tmythread.Create(RunStart: Boolean;
p: PUDPData;
FrmHandle: HWND);
begin
Handle := FrmHandle;
//主线程句柄
UdpData := P;
//主线程传过来的需要处理的数据指针
inherited Create(RunStart);
end;

procedure Tmythread.Execute;
begin
{Place thread code here}
FreeOnTerminate := True;
while Not Terminateddo
begin
//……处理数据UdpData,时间比较长
//涉及到主线程中的可视控件用了Synchronize方法同步
Suspend;
//处理完后挂起,等待下次调用
end;
end;

主线程中:
procedure TFrmMain.madeThread;//构造数据处理线程
var
i : Integer;
begin
setlength(RecvUDP,Thread_count-1);//创建Thread_count个数据缓冲区RecvUdp
setlength(mythread, Thread_count - 1);//创建Thread_count个数据处理线程
For i := 0 to Thread_count - 1do
//可能有很多线程
begin
new(RecvUDP);
mythread := Tmythread.Create(True, RecvUDP, FrmMain.Handle);
//一个数据处理线程对应一个数据缓冲区(创建后先挂起)
end;
end;

当主线程中有数据要处理时唤醒一个线程来处理
问题是我在结束程序时在主窗体的close中调用以下自定义程序FreeThread,终止线程出错:
procedure TFrmMain.FreeThread;// 释放线程数组和数据缓冲数组
var
i : Integer;
begin
For i := 0 to Thread_count - 1do
begin
mythread.Terminate;
mythread.WaitFor;//到这里时程序死了,不响应
dispose(RecvUDP);
end;
end;

我也试过这么写:
procedure TFrmMain.FreeThread;// 释放线程数组和数据缓冲数组
var
i : Integer;
begin
For i := 0 to Thread_count - 1do
begin
mythread.suspend;
mythread.Terminate;
dispose(RecvUDP);
end;
end;
//提示错误的指针,我想是线程Terminate后还没有真正结束,但主线程中的缓冲数组已经释放掉了。
我应该怎样保证在关闭整个程序时把线程安全的释放掉??
我在大富翁里找了很久,也试了大家说的很多方法,但没有很好解决,请大家帮我看看。谢谢,我只有这么点分
 
呵呵, 把RecvUDP交给线程去释放。 主进程不用管它。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部