<div dir="ltr">Hi!<br><br>I have a similar problem when using threads with synchronize...  And I understand that threads in FPC/Lazarus under Linux/BSD works like this:<br><br>When you call synchronize from inside of you thread, this sends a message to application thread with the procedure that will be used to synchronize AND WAIT FOR a response from application thread of the execution of sync procedure. BUT when you call Thread.WaitFor in application thread, the application don't process any messages because it is waiting the thread finish, and thread don't finish because it is waiting a response of application thread of the execution of sync procedure... and you have your aplication freeze!<br>
<br>My solution in this case is override the WaitFor procedure...<br><br>procedure TMyThread.WaitFor;<br>begin<br>   while not ended do <br>      application.processmessages;<br>end;<br><br>...and var ended must be set to true in the last line of procedure execute...<br>
<br><br>Fabio Luis Girardi<br><br><div class="gmail_quote">2008/9/16 Luca Olivetti <span dir="ltr"><<a href="mailto:luca@ventoso.org">luca@ventoso.org</a>></span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
En/na Graeme Geldenhuys ha escrit:<div class="Ih2E3d"><br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
procedure TtiLogToCacheAbs.Terminate;<br>
begin<br>
  writeln('>> TtiLogToCacheAbs.Terminate');<br>
  FThrdLog.Terminate;<br>
  writeln('   called .Terminate() and now calling .WaitFor()');<br>
  FThrdLog.WaitFor;<br>
  writeln('<< TtiLogToCacheAbs.Terminate');<br>
end;<br>
<br>
Any ideas?<br>
</blockquote>
<br></div>
Do you call synchronize inside the thread?<br>
Anyway, I don't usually call WaitFor (I've had many problems with it), I set a flag in the thread and I loop sleeping (or calling checksynchronize if the thread uses synchronize) until it's true, eg:<br>
<br>
procedure TMyThread.execute;<br>
begin<br>
  while not terminated do<br>
  begin<br>
    ....<br>
  end;<br>
  finished:=true;<br>
end;<br>
<br>
<br>
<br>
<br>
MyThread.Terminate;<br>
while not MyThread.Finished do sleep(100);<br>
<br>
or<br>
<br>
while not MyThread.Finished do CheckSynchronize(100);<br>
<br>
Bye<br>
-- <br><font color="#888888">
Luca</font><div><div></div><div class="Wj3C7c"><br>
<br>
_______________________________________________<br>
fpc-pascal maillist  -  <a href="mailto:fpc-pascal@lists.freepascal.org" target="_blank">fpc-pascal@lists.freepascal.org</a><br>
<a href="http://lists.freepascal.org/mailman/listinfo/fpc-pascal" target="_blank">http://lists.freepascal.org/mailman/listinfo/fpc-pascal</a><br>
</div></div></blockquote></div><br></div>