Thema: Delphi Thread Queue probleme

Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#1

Thread Queue probleme

  Alt 1. Jun 2018, 21:27
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

Geändert von EWeiss (11. Jul 2019 um 15:51 Uhr)
  Mit Zitat antworten Zitat