Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Womit synchronisiert tThread.Synchronize?

  Alt 26. Feb 2005, 14:09
Ich habe mir schon fast gedacht, dass du da noch mal nachfragst. Mach mal eine neue Konsolenanwendung und dann kopierst du das mal da rein:
Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}

uses
  Windows;

var
  hEvents: array[0..2] of THandle;

function WorkingThread(p: Pointer): Integer;
var
  i: Integer;
begin
  for i := 0 to 9 do
  begin
    writeln(i);
    sleep(1500);
    SetEvent(hEvents[0]);
  end;
  SetEvent(hEvents[1]);
  result := 0;
end;

function WatchThread(p: Pointer): Integer;
var
  bRunning: Boolean;
  ThreadID: Cardinal;
  wfmo: DWORD;
begin
  bRunning := True;
  CloseHandle(BeginThread(nil, 0, @WorkingThread, nil, 0, ThreadID));
  while bRunning do
  begin
    wfmo := WaitForMultipleObjects(length(hEvents)-1, @hEvents[0], False, INFINITE);
    if (wfmo - WAIT_OBJECT_0) = 0 then
    begin
      writeln('OK');
      SetEvent(hEvents[2]);
    end
    else
    begin
      writeln('Finish');
      bRunning := False;
    end;
  end;
  result := 0;
end;

var
  ThreadID: Cardinal;
begin
  hEvents[0] := CreateEvent(nil, False, False, 'Work');
  hEvents[1] := CreateEvent(nil, False, False, 'Finish');
  hEvents[2] := CreateEvent(nil, False, False, 'Continue');
  CloseHandle(BeginThread(nil, 0, @WatchThread, nil, 0, ThreadID));
  Readln;
end.
Nach jeder Ausgabe vom WorkingThread schreibt der WatchThread sein OK und zum Schluss, wenn der WorkingThread fertig ist eben "Finish". Das sleep ist nur dazu da, damit man sieht, wie das abläuft.

So das ganze ist etwas komplex. Mal sehen, ob ich es verständlich erklären kann. Im Prinzip benachrichtigen sich die Threads gegeseitig. Der WorkingThread sagt mit SetEvent(hEvents[0]);, dass eine Berechnung fertig ist. Der WatchThread wartet mit wfmo := WaitForMultipleObjects(length(hEvents)-1, @hEvents[0], False, INFINITE); auf die Signalisierung eines Events aus dem Array. Ist es das nullte Event, schreibt es sein OK in die Konsole. Dann löst es selber ein Event aus auf das der WorkingThread mit WaitForSingleObject(hEvents[2], INFINITE); wartet damit er weiter machen kann.

Im Endeffekt ist es auch eine CriticalSection - nur eben mit Benachrichtigung.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat