Announcement

Collapse
No announcement yet.

Waitfor und Delphi 7?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Waitfor und Delphi 7?

    Hallo,<br>

    waitfor scheint ja nun auch unter D7 nicht zu wollen.<br>
    ("TThread_waitfor in Delphi 6" in diesem Forum)<br>

    Hat jemand schon eine Idee, wie man das umgehen kann?<br>
    Sowas wie "While not Terminated do;", evtl erweitert mit einem Timeout?<br>

    Gruß<br>
    Matthias

  • #2
    Am besten auf .Terminated; und .Terminate verzichten, und mit API, Events arbeiten.

    <pre>

    type
    TNewThread = class(TThread)
    private
    FTerminate: THandle;
    protected
    procedure Exceute; override;
    public
    procedure Terminate; // overload !! leider nicht virtual !!
    procedure TerminateAndWaitFor;
    end;<br>

    procedure TNewThread.Exceute;
    var
    Events: array[0..x -1] of THandle;
    begin
    try
    FTerminate := CreateEvent(nil, False, False, nil);
    try
    Events[0] := FTerminate;
    Events[1] := andere Handles wie COMM, Mutex, Process usw.
    while not Terminated do
    case WaitForMultipleObjects(x, @Events, INIFINITE) of
    WAIT_OBJECT_0 +0: Break; // Terminate wurde aufgerufen
    WAIT_OBJECT_0 +1..x: andere Events in Events[];
    else
    // Fehler !!
    Break;
    end;
    finally
    CloseHandle(FTerminate);
    FTerminate := 0;
    end;
    except
    end;
    end;

    procedure TNewThread.Terminate;
    begin
    SetEvent(FTerminate);
    inherited Terminate;
    end;<br>

    procedure TNewThread.TerminateAndWaitFor;
    var
    Events: array[0..0] of THandle;
    begin
    Terminate;
    if GetCurrentThreadID = MainThreadID then
    begin
    Events[0] := Handle;
    repeat
    case MsgWaitForMultipleObjects(1, @Events, False, 100, QS_ALLINPUT) of
    WAIT_OBJECT_0: Break;
    WAIT_OBJECT_0 +1, WAIT_TIMEOUT:
    begin
    Application.ProcessMessages;
    if Application.Terminated then Break; // eventuell nötig !!
    end;
    else
    // error !!!
    Break;
    end;
    until False;
    end else
    begin
    // aus einem anderen Thread, der kann warten
    WaitForSingleObject(Handle, INIFINITE);
    end;
    end;<br>

    </pre>

    Gruß Hage

    Comment

    Working...
    X