Thema: FastSwitch

Einzelnen Beitrag anzeigen

Furtbichler
(Gast)

n/a Beiträge
 
#27

AW: FastSwitch

  Alt 26. Dez 2013, 19:33
Delphi-Quellcode:
    hEvent := CreateEvent(nil, True, False, nil);
    PostThreadMessage(RenderThreadId, WM_QUIT, 0, hEvent);
    WaitRe := WaitForSingleObject(hEvent, 1000);
    CloseHandle(hEvent);
im Thread signalisiere ich wenn er beendet wurde
  SetEvent(Msg.LParam); Das trifft aber nicht rechtzeitig ein egal ob ich jetzt 1 oder 10 Sekunden übergebe
Verstehe ich nicht. Was 'trifft aber nicht rechtzeitig ein'. Wenn ich das teste, klappt es:
Delphi-Quellcode:
Program Project2;

{$APPTYPE CONSOLE}

Uses
  SysUtils, Windows, messages;

Var
  WaitRe, RenderThreadId, hEvent: Cardinal;

Function SoVisThread(glCtrl: PLongWord): DWORD;
Var
  MsgReturn: LongBool;
  Msg: tagMSG;
  VisualizerQuitted: Boolean;

Begin
  VisualizerQuitted := False;
  Repeat
    write('Thread loop');
    MsgReturn := GetMessage(Msg, 0, 0, 0);
    If ((Msg.message = WM_QUIT) Or (Msg.message = WM_CLOSE)) Then Begin
      Writeln('*** close received. set Event ');
      VisualizerQuitted := true;
    End;
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  Until (integer(MsgReturn) <= 0) or VisualizerQuitted;

  SetEvent(hEvent);
  RenderThreadId := 0;
  Result := 0;
  Writeln('Thread finished');
  ExitThread(0);
End;

Begin
  hEvent := CreateEvent(Nil, True, False, Nil);

  BeginThread(Nil, 0, @SoVisThread, Nil, 0, RenderThreadId);
  Writeln('Thread created. Press ENTER to stop the thread');

  ReadLn;

  PostThreadMessage(RenderThreadId, WM_QUIT, 0, 0);
  Writeln('Close signalled, waiting for event');
  WaitRe := WaitForSingleObject(hEvent, INFINITE);

  CloseHandle(hEvent);
  writeln('Done (Press ENTER to terminate)');
  ReadLn;
End.
Ich habe das Event-Handle global deklariert, damit es vom Thread in jedem Fall verwendet wird und nicht nur dann, wenn es per Message übergeben wurde. Außerdem wartet 'WaitforSingleObject' jetzt solange, bis der Thread fertig ist.
  Mit Zitat antworten Zitat