AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Thread Queue probleme

Ein Thema von EWeiss · begonnen am 1. Jun 2018 · letzter Beitrag vom 3. Jun 2018
 
EWeiss
(Gast)

n/a Beiträge
 
#1

Thread Queue probleme

  Alt 1. Jun 2018, 22: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 16:51 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:09 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