Hi There, I am writing my "prime finder" app to understand how thread synchronization works. I tried two methods (critical section and rtlevent), both have problem. For example the rtlevent version will run for a while then randomly stops. However, after the thread stops working it seems that the GUI is still responsive.
Here is three core functions from then rtlevent version: procedure TPrimeFinder.Execute; begin while not Terminated do begin RTLeventWaitFor(Barrier); if not IsPrime then Number := 0; Application.QueueAsyncCall(@AddPrime, PtrInt(Self)); RTLeventResetEvent(Barrier); end; end; procedure TPrimeFinder.AddPrime(data: PtrInt); var tr: TPrimeFinder; begin tr := TPrimeFinder(data); with fmMain do begin if tr.Number > 0 then begin cnt += 1; if tr.Number > max then max := tr.Number; end; tr.Number := num; RTLeventSetEvent(tr.Barrier); Inc(num); leCount.Text := IntToStr(cnt); leMax.Text := IntToStr(max); end; end; procedure TfmMain.Button1Click(Sender: TObject); var i, c: Integer; begin num := 2; c := StrToIntDef(edThreads.Text, 1); if c < 1 then c := 1; SetLength(wk, c); for i := 0 to c - 1 do begin wk[i] := TPrimeFinder.Create(False); wk[i].FreeOnTerminate := True; wk[i].Barrier := RTLEventCreate; wk[i].Number := num; Inc(num); RTLeventSetEvent(wk[i].Barrier); end; end; I suspect that it is blocked on the RTLeventWaitFor, because if I use this: RTLeventWaitFor(Barrier, 1000); It will periodically pause for 1 second, then continue. Is this a problem in Application.QueueAsyncCall, or I made some mistakes? Thanks! Xiangrong
_______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal