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:
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;
Vorher habe ich TThread.Synchronize verwendet das hat die weitere Verarbeitung von anderen Dingen im Main Thread geblockt.
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:
EInvalidPointer with message 'Invalid pointer operation'.
sehr oft..
gruss