Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Thread Queue probleme (https://www.delphipraxis.net/196596-thread-queue-probleme.html)

EWeiss 1. Jun 2018 21:27


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:
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

EWeiss 2. Jun 2018 09:55

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

KodeZwerg 2. Jun 2018 11:46

AW: Thread Queue probleme
 
Ich bin bestimmt wieder völlig falsch aber vielleicht meinst Du WaitForSingleObject bzw WaitForMultipleObjects um innerhalb threads so etwas wie einen Fortschritt zu registrieren?

mkinzler 2. Jun 2018 11:54

AW: Thread Queue probleme
 
Zitat:

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!
Das kommt auch auf die Erwartungshaltung an! Das ist ein Forum mit freiwilligen Helfern und kein kommerzielles Supportforum wöfur man Blechen muss! Und selbst dann könntest Du nicht erwarten, dass eine am späten Freitag abend gestellt Frage bis Samsatg Mittag beantwortet wird!

KodeZwerg 2. Jun 2018 12:03

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.

EWeiss 2. Jun 2018 12:08

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

KodeZwerg 2. Jun 2018 12:34

AW: Thread Queue probleme
 
Ich hoffe einer dieser Links zeigt es Dir richtig an.
Unterschied TTread.Synchronize / TThread.Queue oder Delphi Queue and Synchronize

EWeiss 2. Jun 2018 12:39

AW: Thread Queue probleme
 
Zitat:

Zitat von KodeZwerg (Beitrag 1403690)
Ich hoffe einer dieser Links zeigt es Dir richtig an.
Unterschied TTread.Synchronize / TThread.Queue oder Delphi Queue and Synchronize

Ich weis was Queue and Synchronize ist das hatte ich bereits gepostet.
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:

EInvalidPointer with message 'Invalid pointer operation'.
Also nochmal zur Verdeutlichung.

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

Zacherl 2. Jun 2018 13:07

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:
vProcList
, falls
Delphi-Quellcode:
bFound = True
.

dummzeuch 2. Jun 2018 13:13

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:56 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz