Zitat:
Also wäre eine Erklärung oder Referenz angebrachter als der Hinweis, dass das geht und eigentlich recht einfach ist.
Danke Ja!
Aber ich kann nicht von irgend jemand erwarten das er für mich code schreibt.
Daher muss ich es im Moment leider so belassen auch wenn es mich stört.
Ich muss erst mal schauen ob es ein Beispiel im Net gibt wo ich das mal schritt für schritt beim debuggen verfolgen kann.
das ist meine Lernmethode
Er hat mir ja freundlicher weise den weg gezeigt nur ich kann es nicht nachvollziehen weil es Anhaltspunkte sind.
Das ist mein Thread
Delphi-Quellcode:
function SoVisThread(glCtrl: PLongWord): DWORD;
//... nur nötiger teil
repeat
MsgReturn := GetMessage(Msg, 0, 0, 0);
if ((Msg.message = WM_QUIT) or (Msg.message = WM_CLOSE)) then
VisualizerQuitted := True
else if Msg.message = DataReadyMsg then
begin
case Msg.wParam of
DataReady:
BassSoVis.SoRender(glCtrl^);
RequestRestFlag:
begin
p1 := VisDataPointer;
inc(p1, 70);
p1^ := 0;
end;
end;
end;
TranslateMessage(Msg);
DispatchMessage(Msg);
until (integer(MsgReturn) <= 0) or VisualizerQuitted;
end else
PostMessage(BassSoVis.MessageHandle, DataReadyMsg, StartVisOut, 0);
RenderThreadId := 0;
Result := 0;
ExitThread(0);
end;
Dieser wird beendet über
Delphi-Quellcode:
procedure TBASSSoVis.BassSonVisStop;
begin
EndByProgram := True;
if (RenderThreadId <> 0) then
begin
PostThreadMessage(RenderThreadId, WM_QUIT, 0, 0);
repeat
Sleep(15);
WinProcessMessages;
until RenderThreadId = 0;
end else
BassSoVisFree := True;
end;
gruss
Hier warte ich dann solange bis die RenderThreadId = 0 ist.
Also der Thread beim beenden diese auf 0 gesetzt hat.
nur beim schalten in Millisekunden Bereich funktioniert das nicht.
Auch das entfernen von Sleep(15) macht keinen unterschied.
Der Thread läuft noch während die anderen gestartet wurden.
gruss