![]() |
Thread Queue probleme
Vielleicht kann mir jemand sagen woran es liegt.
Delphi-Quellcode:
function TAudioVolume.OnStateChanged(NewState: uint): HResult;
begin if MainThreadID <> GetCurrentThreadId then begin TThread.Queue(nil, procedure begin if Assigned(FOnSessionStateEvent) then FOnSessionStateEvent(self, NewState); end); end; Result := S_OK; end;
Delphi-Quellcode:
Vorher habe ich TThread.Synchronize verwendet das hat die weitere Verarbeitung von anderen Dingen im Main Thread geblockt.
procedure TMainClass.SessionStateEvent(Sender: TCustomAudioVolume; NewState: integer);
var I, K: integer; ProcId: DWORD; vProcList: TProcesses; bFound: BOOL; begin bFound := false; for I := 0 to Length(AudioVolumeArr) - 1 do begin if AudioVolumeArr[I] = Sender then break; end; ProcId := StrToInt(AudioVolumeArr[i].AudioSessionInfo(I).ProcessID); if (ProcId <> 0) and (NewState = 0) then begin // ProcList initialisieren vProcList := TProcesses.Create; // Prozesse einlesen vProcList.ReadSystem; // prüfen ob aktiver prozess existiert for K := 0 to vProcList.Count-1 do if vProcList[K].ID = ProcId then begin bFound := true; // Raus hier break; end; if not bFound then begin // Timer deaktivieren Killtimer(HSprMaster, ID_MRENDER); // Alle Objekte die mit diesen verbunden sind löschen for I := 0 to Length(AudioVolumeArr) - 1 do gSprSession.GD_DeleteLinkedObject(succ(ID_BVOLUME) + i); // Array löschen Setlength(AudioVolumeArr, 0); // Session erstellen CreateSession; // Window aktualisieren gSprSession.GI_UpdateWindow(HSprSession, false); // Timer aktivieren SetTimer(HSprMaster, ID_MRENDER, 60, nil); // Prozessliste löschen und freigeben vProcList.Clear; FreeAndNil(vProcList); end; end; end; Jetzt verwende ich statt dessen TThread.Queue Ich kann jetzt das alte control löschen und die Sessions neu erstellen. Mein Problem ist aber das da anscheinend immer noch was blockt oder durcheinander bringt, was auch immer bekomme diese Fehlermeldung sobald ich auf eine Funktion von TAudioVolume zugreife. Ich weis nicht was falsch läuft und wie ich das verhindern\beheben kann. Zitat:
gruss |
AW: Thread Queue probleme
Von mehr als 61918 + die nach mir gefolgten Foren Mitgliedern.
Ist niemand in der Lage mir auf meine Frage eine Antwort zu geben? Schwach wirklich! ;) :duck: Es muss doch eine Möglichkeit geben den Thread zu synchronisieren auch wenn ich nicht auf die Rückgabe warte. Queue >= PostMessage Synchronize >= SendMessage gruss |
AW: Thread Queue probleme
Ich bin bestimmt wieder völlig falsch aber vielleicht meinst Du
![]() ![]() |
AW: Thread Queue probleme
Zitat:
|
AW: Thread Queue probleme
Hier ist ein Beispiel wo ich einen Thread starte aber nicht direkt auf sein Ende warte.
entfernt da es nicht beim Problem hift. |
AW: Thread Queue probleme
Das hat absolut nichts mit meinem Problem zu tun .. trotzdem Dank für den Versuch.
Es geht um die Synchronisierung nicht darum auf etwas zu warten. Ich habe keinen Einfluss auf das Event und wenn das gefeuert wird gibt es nix zu warten. Dann muss ich handeln. gruss |
AW: Thread Queue probleme
Ich hoffe einer dieser Links zeigt es Dir richtig an.
![]() ![]() |
AW: Thread Queue probleme
Zitat:
Siehe! Queue >= PostMessage (Wenn ich nicht warte kommt der unten aufgeführte Fehler) Synchronize >= SendMessage (Wenn ich warte kann ich keine UI mehr erstellen in welcher Form auch immer) Im Grunde nichts anderes aber selbst wenn ich es weis behebt es nicht mein momentanes Problem das ich nach dem Event nicht mehr auf TAudioVolume zugreifen kann ohne die besagte Fehlermeldung zu bekommen. Zitat:
Ich kann User Interface erstellen wenn ich Queue verwende aber es wirft mir die Pointer durch die Gegend. Das ist mein Problem! Synchronize funktioniert nicht weil hier auf eine Rückgabe gewartet wird und das erstellen von User Interface unmöglich ist im Main Thread. gruss |
AW: Thread Queue probleme
Kannst du da denn nicht mal genauer reinsteppen mit dem Debugger und eine genaue Stelle nennen, an der es zum ersten Mal kracht nach dem Event? Btw.: Ich glaube du leakest den Speicher von
Delphi-Quellcode:
, falls
vProcList
Delphi-Quellcode:
.
bFound = True
|
AW: Thread Queue probleme
Hast Du schon ermittelt, welche Speicherfreigabe die Exception auslöst? Wenn ja, mal im ensprechenden Destructor einen Breakpoint setzen und schauen, von wo und wie oft er aufgerufen wurde.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 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