Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 

Re: Programm friert trotz Thread ein (waitforsingleobject)

  Alt 17. Mär 2007, 10:23
Zitat:
gesetzt. Ist das auch ok?
Ansich ja, nur das du damit den Vorteil des Threads global gesehen wieder zerstörst Du hast ja den Thread gebaut damit effektiv gesehen keine unnötigen Prozessorresourcen, sprich CPU-Zeit, verschwendet wird, weil man auf igrendein Ereignis warten muß.

Dein Loop macht aber nun exakt dies. Sie pollt permanant und wartet das der Thread fertig wird. Sie vernichtet damit CPU-Zeit wweil sie die meiste Zeit nur while not fertig do; ausführt.

Ausgehend von diesem Source http://www.delphipraxis.net/internal...elay+revisited kann man das verbesseren.

Delphi-Quellcode:
function WaitFor(Event: THandle): Boolean;
begin
  Result := False;
  while not Result do
    case MsgWaitForMultipleObjects(1, Event, False, INFINITE, QS_ALLINPUT) of
      WAIT_OBJECT_0:
        Result := True;
      WAIT_OBJECT_0 +1:
        begin
          Application.ProcessMessages;
          if Application.Terminated then Exit;
        end;
    else
      RaiseLastWin32Error;
    end;
end;
Diese Funktion wartet auf ein Event, zb. Thread.Handle wird terminiert, und würde mit TRUE turückkehren. Solange dieses Event nicht eintritt wartet sie auf Nachrichten im Messagesqueue der Anwendung. Sind welche da so werden diese mit Application.ProcessMessages abgearbeitet. Sollte dabei die Anwendung beendet worden sein kehrt die Funktion mit FALSE zurück. Die restliche Zeit wo NICHTS passiert legt MsgWaitForMultipleObjects() den Mainthread der Anwendung Schlafen -> sowas wie Sleep(). Das führt dazu das diese CPU-Zeit dem Gesamtsystem zur Verfügung gestellt wird OHNE das deine eigene Rechnerzeit sinken würde.
Wenn zb. deine Mainthread und dein Arbeitsthreahd sich zu 50% die komplette CPU-Zeit teilen müssten soe würde nach deiner Methode die 50% des Mainthreades in einer sinnlosen Schleife verbraten. Der Arbeitsthread kann nur 50% der Rechnerzeit arbeiten. Mit obiger Variante würde der Mainthread aber wirklich nur arbeiten wenn 1. der Arbeitsthread fertig ist oder Messages vorliegen, also sagen wir mal 1% der 50% der Zeit. Die restliche Zeit kommt nun deinem Arbeitsthreah zugute. Dieser würde nun 99% der CPU Zeit bekommen und ergo doppelt so schnell fetig sein.

Obwohl man den Unterschied nicht wahrnimmt stellt WaitFor() die Bearbeitung im Program von einem Polling in ein Ereignisorientiertes System um. Dh. nur wenn ein Ereignis das wir wünschen eintritt werden wir aktiv. Beim Polling sind wir immer aktiv und fragen tausendemal einen Zustand ab der nur bveim 1001 mal tatsächlich eintrifft.

Gruß Hagen

PS: übrigens -> Thread.WaitFor; dürfte exakt das selbe machen
  Mit Zitat antworten Zitat