![]() |
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.
|
AW: Thread Queue probleme
Zitat:
Beim beenden der Anwendung bekomme ich ein Speicherleck Meldung von der vProcList angezeigt. Glaube aber das ist deshalb weil die Pointer verschoben werden wie oder wo auch immer. Denn ich gebe die ja frei FreeAndNil(vProcList); Aber es fruchtet nicht die Speicherlecks kommen trotzdem. Zitat:
Die Zeile ist diese aber die macht nichts besonderes was den Fehler auslösen könnte.
Delphi-Quellcode:
Ok ;)
function TAudioVolume.AudioSessionInfo(SessionIndex: integer): TAudioSessionInfo;
var Lbl: TLabel; tmpStr: string; bNull: BOOL; i: integer; begin Result.ActiveSession := ''; Result.DisplayName := ''; Result.StateSession := ''; Result.IconPath := ''; Result.SessionIdentifier := ''; Result.ProcessID := ''; Result.IsSystemSoundsSession := -1; Result.SessionGuid := StringToGUID('{00000000-0000-0000-0000-000000000000}'); Result.Device := nil; Result.PID := 0; bNull := False; tmpStr := ExtractFileExt(FAudioSessionInfo.DisplayName); \\ <<<<<<< Hier kracht es if Length(tmpStr) > 1 then tmpStr := ChangeFileExt(FAudioSessionInfo.DisplayName, '') else tmpStr := FAudioSessionInfo.DisplayName; FreeAndNil(vProcList); steht an falscher stelle muss eine Zeile tiefer. Danke. Werde mal schauen ob das mein Problem behebt. Die Leaks sind behoben aber das Problem bleibt bestehen. Habe nur diese beiden. Siehe Anhang. gruss |
AW: Thread Queue probleme
Zitat:
|
AW: Thread Queue probleme
Zitat:
Deshalb habe ich sie eine Zeile tiefer gesetzt Fehler ist behoben was die Leaks betrifft. Die Pointer spielen aber immer noch verrückt. Die anderen Speicherlecks.. siehe Shots. gruss |
AW: Thread Queue probleme
Zitat:
Sondern der nächste darauffolgende zugriff auf TAudioVolume. gruss |
AW: Thread Queue probleme
Ich liege hundert pro eh falsch aber gesagt haben mag ichs mal.
Setze doch mal einen BP vor Zeile
Delphi-Quellcode:
und stepp dich da mal rein ob das alles seine Richtigkeit hat. Noch kommt mir das Self komisch vor, aber ich kann mich, wie so oft bei Dir, total irren.
FOnSessionStateEvent(self, NewState);
Und verträgt Result.IsSystemSoundsSession :-1; einen negativen Wert ? Zitat:
Wegen Result.DisplayName := ''; Lass Dir doch an dieser Stelle ne MessageBox anzeigen was du da so für Daten im Speicher hast. |
AW: Thread Queue probleme
bekomme es nicht geregelt. egal.
Habe noch andere Projekte. gruss |
AW: Thread Queue probleme
Wenn du doch nochmal reinschauen willst: Was sagt denn der Debugger zu den Werten von
Delphi-Quellcode:
,
Self
Delphi-Quellcode:
, etc? Steht da unter Umständen vielleicht schon "Müll" drinnen? Nur mit statischen Informationen ist es hier leider recht schwer die Fehlerquelle zu ermitteln.
FAudioSessionInfo
|
AW: Thread Queue probleme
Zitat:
self und AudioSessionInfo siehe Anhang. Ist schade aber so kann ich das Projekt nicht fertig stellen. sorry. Ich habe zu wenig Erfahrung mit Threads so das ich den Fehler selber analysieren könnte. Der Debugger ist in dem Fall nicht Hilfreich. Ganz umsonst war das Projekt nicht habe 1>2 Fehler in meiner Library beheben können und eine neue Funktion addiert um zu vor erstellte Kombinierte Objekte in einem rutsch zu löschen.
Delphi-Quellcode:
EDIT:
// Alle Objekte die mit diesen verbunden sind löschen
for I := 0 to Length(AudioVolumeArr) - 1 do gSprSession.GD_DeleteLinkedObject(succ(ID_BVOLUME) + i); // neue Funktion Habe meine Funktion nochmal optimiert ändert aber nichts an meinem Pointer Problem doch das hier (AudioVolumeArr[M].Free;)
Delphi-Quellcode:
gruss
procedure TMainClass.SessionStateEvent(Sender: TCustomAudioVolume; NewState: integer);
var IntI, K, M: integer; ProcId: DWORD; vProcList: TProcesses; bFound: BOOL; begin bFound := false; for IntI := 0 to Length(AudioVolumeArr) - 1 do begin if AudioVolumeArr[IntI] = Sender then begin ShowMessage(AudioVolumeArr[IntI].AudioSessionInfo(IntI).DisplayName + #13#10 + 'Index ' + IntToStr(IntI) + ' hat jetzt State ' + IntToStr(NewState)); ProcId := StrToInt(AudioVolumeArr[IntI].AudioSessionInfo(IntI).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 M := 0 to Length(AudioVolumeArr) - 1 do begin gSprSession.GD_DeleteLinkedObject(succ(ID_BVOLUME) + M); // TAudioVolume freigeben AudioVolumeArr[M].Free; end; // Array löschen SetLength(AudioVolumeArr, 0); // Session erstellen CreateSession; // Window aktualisieren gSprSession.GI_UpdateWindow(HSprSession, false); // Timer aktivieren SetTimer(HSprMaster, ID_MRENDER, 60, nil); end; // Prozessliste löschen vProcList.Clear; // Prozessliste freigeben FreeAndNil(vProcList); end; end; end; end; |
AW: Thread Queue probleme
Ahchso, ne ich meinte eigentlich das
Delphi-Quellcode:
innerhalb von
Self
Delphi-Quellcode:
. Also dann, wenn es kracht. Meine Vermutung war halt, dass hier schon irgendwelche Zeiger (vlt. sogar
TAudioVolume.AudioSessionInfo
Delphi-Quellcode:
) ins leere laufen.
Self
|
AW: Thread Queue probleme
Zitat:
TAudioSessionInfo ist ein Record. Vielleicht bin ich auch zu dumm zu verstehen was du meinst. ;) Habe bald den Eindruck als wenn die AudioSes.dll (Win7) selbst fehlerhaft ist ![]() gruss |
AW: Thread Queue probleme
Hat sich erledigt..
Man achte auf den Unterschied :wall: :duck:
Delphi-Quellcode:
for M := 0 to Length(AudioVolumeArr) - 1 do begin gSprSession.GD_DeleteLinkedObject(succ(ID_BVOLUME) + M); // TAudioVolume freigeben AudioVolumeArr[M].Free; end;
Delphi-Quellcode:
War so auf das Grafik Objekt fixiert das ich gar nicht bemerkt habe das die dazugehörige Klasse nicht freigegeben wurde.for I := 0 to Length(AudioVolumeArr) - 1 do gSprSession.GD_DeleteLinkedObject(succ(ID_BVOLUME) + i); Manchmal ist man einfach nur blöde. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:52 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-2025 by Thomas Breitkreuz