(Gast)
n/a Beiträge
|
AW: FastSwitch
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.
|
|
Zitat
|