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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie, exception-handling, um Ihren code, und nicht sperren Sie beide bitmaps in der gleichen Zeit:
Wenn das immer noch abstürzt/erroring, dann haben Sie einen anderen Fehler im code haben Sie nicht gezeigt. Vor allem wenn man bedenkt, dass Sie sollte nie eine Fehlermeldung erhalten, betreten/verlassen eines kritischen Abschnitts, es sei denn, der kritische Abschnitt selbst ist beschädigt.