AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Womit synchronisiert tThread.Synchronize?
Thema durchsuchen
Ansicht
Themen-Optionen

Womit synchronisiert tThread.Synchronize?

Ein Thema von xineohp · begonnen am 26. Feb 2005 · letzter Beitrag vom 26. Feb 2005
Antwort Antwort
Benutzerbild von Luckie
Luckie

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

Re: Womit synchronisiert tThread.Synchronize?

  Alt 26. Feb 2005, 15: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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz