似乎还是线程的问题: 以下修改indy的pas文件的方法,虽然不能完全解决问题,至少有点提示作用在idThread类中增加一个公开的方法ProcessMessages,然后在TerminateYarn中调用。代码如下procedure TIdThread.ProcessMessages; begin {$IFDEF MSWINDOWS} if GetCurrentThreadID = MainThreadID then begin CheckSynchronize; Application.ProcessMessages; end; {$ENDIF} {$IFDEF LINUX} if GetCurrentThreadID = MainThreadID then begin CheckSynchronize(1000); end; {$ENDIF} end;procedure TIdSchedulerOfThread.TerminateYarn(AYarn: TIdYarn); var LYarn: TIdYarnOfThread; begin LYarn := TIdYarnOfThread(AYarn); if LYarn.Thread.Suspended then begin // If suspended, was created but never started // ie waiting on connection accept LYarn.Thread.Free; FreeAndNil(LYarn); end else begin // Is already running and will free itself LYarn.Thread.Stop; LYarn.Thread.ProcessMessages; //此处增加了处理。 // Dont free the yarn. The thread frees it (IdThread.pas) end; end;TidThread所在单元增加uses{$IFDEF MSWINDOWS} Windows, Forms, {$ENDIF}
以下修改indy的pas文件的方法,虽然不能完全解决问题,至少有点提示作用在idThread类中增加一个公开的方法ProcessMessages,然后在TerminateYarn中调用。代码如下procedure TIdThread.ProcessMessages;
begin
{$IFDEF MSWINDOWS}
if GetCurrentThreadID = MainThreadID then
begin
CheckSynchronize;
Application.ProcessMessages;
end;
{$ENDIF}
{$IFDEF LINUX}
if GetCurrentThreadID = MainThreadID then
begin
CheckSynchronize(1000);
end;
{$ENDIF}
end;procedure TIdSchedulerOfThread.TerminateYarn(AYarn: TIdYarn);
var
LYarn: TIdYarnOfThread;
begin
LYarn := TIdYarnOfThread(AYarn);
if LYarn.Thread.Suspended then begin
// If suspended, was created but never started
// ie waiting on connection accept
LYarn.Thread.Free;
FreeAndNil(LYarn);
end else begin
// Is already running and will free itself
LYarn.Thread.Stop;
LYarn.Thread.ProcessMessages; //此处增加了处理。
// Dont free the yarn. The thread frees it (IdThread.pas)
end;
end;TidThread所在单元增加uses{$IFDEF MSWINDOWS}
Windows, Forms,
{$ENDIF}