Einzelnen Beitrag anzeigen

Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#192

AW: FireMonkey Sammelthread

  Alt 16. Jul 2013, 14:40
@Stahli

Mit Threads sollte das nicht funktionieren. Soweit ich weiß, ist die GUI von FireMonkey auch nicht threadsicher. Sie baut unter Windows ebenfalls auf GDI auf, auch wenn einige Renderaufgaben von der Grafikkarte übernommen werden. Die vorgerenderten Abschnitte werden dann aber wieder als Bitmap zurück in den Hauptspeicher geholt und "ganz normal" angezeigt. Meiner Meinung nach ist dieses Konzept auch der Hauptgrund, weshalb trotz GPU-Unterstützung die Framerate unter FireMonkey so - ähmmm - verbesserungswürdig ist. Falls ich das falsch verstanden habe, kann mich jemand gern korrigieren. Ich hatte mir dieses Prinzip vor allem bei den Filtern bzw. Effekten angeschaut.

Um also die Oberfläche eines Formulars während lang andauernden Aktionen nicht einfrieren zu lassen, muß die Aktualisierung aktiv angestoßen oder die blockierenden Aktionen in einen Thread ausgelagert werden. In dieser Beziehung unterscheiden sich VCL und FireMonkey nicht.

Die Synchronisation von Threads geschieht über das Senden von Nachrichten:
Delphi-Quellcode:
unit FMX.Platform.Win;

procedure TPlatformWin.WakeMainThread(Sender: TObject);
begin
  if TThread.CurrentThread.ThreadID <> MainThreadID then
    PostMessage(FThreadSyncHandle, WM_NULL, 0, 0);
end;
Und solange diese nicht (vom Hauptthread) abgeholt werden, passiert hier ebenfalls nichts.

Ich schaue mir mal Dein Testprojekt an.

Ok. Gerade gemacht. Funktioniert doch auch ohne ProcessMessages... Das Problem in Deiner Demo ist, daß Du ProgressBar1.Max auf 100000 setzt. Damit da etwas Sichtbares passiert, brauchst Du einige Liter Kaffee.
Mit Sleep(50) hast Du rund 20 Schritte pro Sekunde. Macht für den gesamten Fortschrittsbalken 100000/20=5000 Sekunden oder 83,3 Minuten.
Thomas Nitzschke
Google Maps mit Delphi

Geändert von Thom (17. Jul 2013 um 01:02 Uhr)
  Mit Zitat antworten Zitat