<div dir="ltr"><div class="gmail_default" style="font-family:'courier new',monospace">Hi There,</div><div class="gmail_default" style="font-family:'courier new',monospace"><br></div><div class="gmail_default" style="font-family:'courier new',monospace">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.</div><div class="gmail_default" style="font-family:'courier new',monospace"><br></div><div class="gmail_default" style="font-family:'courier new',monospace">Here is three core functions from then rtlevent version:</div><div class="gmail_default" style="font-family:'courier new',monospace"><br></div><div class="gmail_default" style><div class="gmail_default" style><font face="courier new, monospace">procedure TPrimeFinder.Execute;</font></div><div class="gmail_default" style><font face="courier new, monospace">begin</font></div><div class="gmail_default" style><font face="courier new, monospace">  while not Terminated do begin</font></div><div class="gmail_default" style><font face="courier new, monospace">    RTLeventWaitFor(Barrier);</font></div><div class="gmail_default" style><font face="courier new, monospace">    if not IsPrime then Number := 0;</font></div><div class="gmail_default" style><font face="courier new, monospace">    Application.QueueAsyncCall(@AddPrime, PtrInt(Self));</font></div><div class="gmail_default" style><font face="courier new, monospace">    RTLeventResetEvent(Barrier);</font></div><div class="gmail_default" style><font face="courier new, monospace">  end;</font></div><div class="gmail_default" style><font face="courier new, monospace">end;</font></div><div style="font-family:'courier new',monospace"><br></div><div style><div style><font face="courier new, monospace">procedure TPrimeFinder.AddPrime(data: PtrInt);</font></div><div style><font face="courier new, monospace">var</font></div><div style><font face="courier new, monospace">  tr: TPrimeFinder;</font></div><div style><font face="courier new, monospace">begin</font></div><div style><font face="courier new, monospace">  tr := TPrimeFinder(data);</font></div><div style><font face="courier new, monospace">  with fmMain do begin</font></div><div style><font face="courier new, monospace">    if tr.Number > 0 then begin</font></div><div style><font face="courier new, monospace">      cnt += 1;</font></div><div style><font face="courier new, monospace">      if tr.Number > max then max := tr.Number;</font></div><div style><font face="courier new, monospace">    end;</font></div><div style><font face="courier new, monospace">    tr.Number := num;</font></div><div style><font face="courier new, monospace">    RTLeventSetEvent(tr.Barrier);</font></div><div style><font face="courier new, monospace">    Inc(num);</font></div><div style><font face="courier new, monospace">    leCount.Text := IntToStr(cnt);</font></div><div style><font face="courier new, monospace">    leMax.Text := IntToStr(max);</font></div><div style><font face="courier new, monospace">  end;</font></div><div style><font face="courier new, monospace">end;</font></div><div style><font face="courier new, monospace"><br></font></div><div style><font face="courier new, monospace"><div>procedure TfmMain.Button1Click(Sender: TObject);</div><div>var</div><div>  i, c: Integer;</div><div>begin</div><div>  num := 2;</div><div>  c := StrToIntDef(edThreads.Text, 1);</div><div>  if c < 1 then c := 1;</div><div>  SetLength(wk, c);</div><div>  for i := 0 to c - 1 do begin</div><div>    wk[i] := TPrimeFinder.Create(False);</div><div>    wk[i].FreeOnTerminate := True;</div><div>    wk[i].Barrier := RTLEventCreate;</div><div>    wk[i].Number := num;</div><div>    Inc(num);</div><div>    RTLeventSetEvent(wk[i].Barrier);</div><div>  end;</div><div>end;</div><div><br></div><div>I suspect that it is blocked on the RTLeventWaitFor, because if I use this:</div><div><br></div><div>    RTLeventWaitFor(Barrier, 1000);</div><div><br></div><div>It will periodically pause for 1 second, then continue.</div><div><br></div><div>Is this a problem in Application.QueueAsyncCall, or I made some mistakes?</div><div><br></div><div>Thanks!</div><div>Xiangrong</div></font></div></div></div></div>