Thema: Delphi Thread Queue probleme

Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#18

AW: Thread Queue probleme

  Alt 3. Jun 2018, 17:42
Wenn du doch nochmal reinschauen willst: Was sagt denn der Debugger zu den Werten von Self , FAudioSessionInfo , 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.
Nein self ist die TAudioVolume Classe da steht kein Müll drin.

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:
// 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
EDIT:
Habe meine Funktion nochmal optimiert ändert aber nichts an meinem Pointer Problem doch das hier (AudioVolumeArr[M].Free;)
Delphi-Quellcode:
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;
gruss

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