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
Antwort Antwort
Seite 1 von 3  1 23      
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
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Thread Queue probleme

  Alt 2. Jun 2018, 10:55
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!

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

Geändert von EWeiss ( 2. Jun 2018 um 11:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Thread Queue probleme

  Alt 2. Jun 2018, 12:46
Ich bin bestimmt wieder völlig falsch aber vielleicht meinst Du WaitForSingleObject bzw WaitForMultipleObjects um innerhalb threads so etwas wie einen Fortschritt zu registrieren?
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Thread Queue probleme

  Alt 2. Jun 2018, 12:54
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!
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Thread Queue probleme

  Alt 2. Jun 2018, 13:03
Hier ist ein Beispiel wo ich einen Thread starte aber nicht direkt auf sein Ende warte.
entfernt da es nicht beim Problem hift.
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 2. Jun 2018 um 13:21 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Thread Queue probleme

  Alt 2. Jun 2018, 13:08
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
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Thread Queue probleme

  Alt 2. Jun 2018, 13:34
Ich hoffe einer dieser Links zeigt es Dir richtig an.
Unterschied TTread.Synchronize / TThread.Queue oder Delphi Queue and Synchronize
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Thread Queue probleme

  Alt 2. Jun 2018, 13:39
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

Geändert von EWeiss ( 2. Jun 2018 um 13:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#9

AW: Thread Queue probleme

  Alt 2. Jun 2018, 14:07
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 vProcList , falls bFound = True .
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.604 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

AW: Thread Queue probleme

  Alt 2. Jun 2018, 14:13
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.
Thomas Mueller
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 17:22 Uhr.
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