Multi-threading in Delphi Synchronisation über Kritische Abschnitte zwischen einem Timer und andere threads

Ist es ein problem der Synchronisation. Ich machte eine Vereinfachung für mein problem, so habe ich eine VCL-Timer und ein paar threads. Die threads zu schreiben versucht, die Dinge in zwei bitmaps, und der timer wird versuchen zu ziehen, die bitmaps in Bildern(TImage). Hier ist eine änderung an meinem code einfacher zu verstehen(das einfügen von code ist sehr vage).

//------------------------------------------------------------------------------
Procedure TMyForm.Add(iX,iY,iNr:integer);
begin
   EnterCriticalSection(csCriticalSection);
   bmRed.Canvas.Lock;
   bmBlue.Canvas.Lock;

   //.... drawing etc...
   bmRed.Canvas.TextOut(iX,iY,IntToStr(iNr));
   bmBlue.Canvas.TextOut(iX,iY,IntToSTr(iNr));

   bmRed.Canvas.Unlock;
   bmBlue.Canvas.Unlock;

   LeaveCriticalSection(csCriticalSection);
end;
//------------------------------------------------------------------------------
procedure TMyForm.tmTimer(...);
begin
   EnterCriticalSection(csCriticalSection);

   bmRed.Canvas.Lock;
   bmBlue.Canvas.Lock;

   //Drawing on bmRed and bmBlue
   imBlue.Canvas.Draw(bmBlue);
   imRed.Canvas.Draw(bmBlue);

   bmRed.Canvas.Unlock;
   bmBlue.Canvas.Unlock;

   LeaveCriticalSection(csCriticalSection);
end;
//------------------------------------------------------------------------------
Procedure TMyThread.Execute();
begin
   Randomize;
   while not terminated do
   begin
      MyFormInstance.Add(Random(100),Random(100),Random(100));

      Sleep(20);
   end;
end;

initialization
   InitializeCriticalSection(csCriticalSection);
finalization
   DeleteCriticalSection(csCriticalSection);

In der Regel der threads gibt mir Fehler bei der Eingabe in den kritischen Abschnitt oder nach ein paar Sekunden wird der timer nicht mehr ziehen mir nichts.

InformationsquelleAutor user558126 | 2013-01-06
Schreibe einen Kommentar