AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi TWinControl via TInterfacedObject via TInterfacedPersistent
Thema durchsuchen
Ansicht
Themen-Optionen

TWinControl via TInterfacedObject via TInterfacedPersistent

Ein Thema von EWeiss · begonnen am 3. Jun 2018 · letzter Beitrag vom 8. Jun 2018
Antwort Antwort
Seite 2 von 3     12 3      
Schokohase
(Gast)

n/a Beiträge
 
#11

AW: TWinControl via TInterfacedObject via TInterfacedPersistent

  Alt 7. Jun 2018, 13:21
@Zacherl

Mit der Anleitung kann man allerdings nur Schiffbruch erleiden, oder? Wo ist denn jetzt der Unterschied zu der vorherigen Situation?

- TAudioVolume erzeugen
- Über TAudioVolumeProxy eine Interface-Instanz weiterreichen
- TAudioVolume freigeben
- Es knallt, wenn die Interface-Instanz auf nil gesetzt wird.

Dieses Verhalten hatte der TE schon selber gebaut und auch noch mit viel weniger Code.

Wenn ich tmpAudioVolume.Free aufrufe dann kracht es mit invalid Pointer weil noch 3 refcounter offen sind. (TInterfacedObject)
Habe es nur testweise mal versucht.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#12

AW: TWinControl via TInterfacedObject via TInterfacedPersistent

  Alt 7. Jun 2018, 13:39
Um was es mir ging..
Ist die Unterschiede zu erfahren was ist besser, schneller bzw. Korrekter in der Ausführung.
Wenn ich keine WinControls verwende macht es eigentlich keinen sinn darauf abzuleiten genauso wenig wie auf TComponent.

Es stört mich nicht weiter da es funktioniert aber einen sinn ergibt das nicht wirklich.

Ich könnte hier einfach tmpAudioVolume.Free mit tmpAudioVolume := Nil ersetzen.
Aber es hängt noch mehr davon ab denn in Destroy müssen viele Dinge freigegeben werden.
Deshalb wäre das keine Lösung.

gruss

Geändert von EWeiss ( 7. Jun 2018 um 13:44 Uhr)
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.380 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: TWinControl via TInterfacedObject via TInterfacedPersistent

  Alt 7. Jun 2018, 14:44
Wenn ich keine WinControls verwende macht es eigentlich keinen sinn darauf abzuleiten genauso wenig wie auf TComponent.
Seh ich auch so.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: TWinControl via TInterfacedObject via TInterfacedPersistent

  Alt 7. Jun 2018, 23:14
@Zacherl

Mit der Anleitung kann man allerdings nur Schiffbruch erleiden, oder? Wo ist denn jetzt der Unterschied zu der vorherigen Situation?

- TAudioVolume erzeugen
- Über TAudioVolumeProxy eine Interface-Instanz weiterreichen
- TAudioVolume freigeben
- Es knallt, wenn die Interface-Instanz auf nil gesetzt wird.
Verstehe ich nicht. Der Proxy soll innerhalb von TAudioVolume als Objektreferenz gehalten werden, nicht als Interface. Erzeugen im Constructor und Freigeben im Destructor. TAudioVolume selbst implementiert dann gar kein Interface mehr und braucht auch nicht von TInterfacedObject/TInterfacedPersistent abzuleiten, sondern nur vom guten alten TObject .

Was intern mit dem Proxy passiert ist dadurch streng reguliert (da die Proxy Instanz privat ist, nie als Interface angesprochen wird und Erzeugung und Freigabe von TAudioVolume geregelt wird.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#15

AW: TWinControl via TInterfacedObject via TInterfacedPersistent

  Alt 8. Jun 2018, 02:38
funktioniert leider nicht und ich musste einiges umbauen.

FProxy.Free; invalid Pointer
Ich lasse es jetzt wie es ist.

gruss
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#16

AW: TWinControl via TInterfacedObject via TInterfacedPersistent

  Alt 8. Jun 2018, 07:53
@Zacherl

Mit der Anleitung kann man allerdings nur Schiffbruch erleiden, oder? Wo ist denn jetzt der Unterschied zu der vorherigen Situation?

- TAudioVolume erzeugen
- Über TAudioVolumeProxy eine Interface-Instanz weiterreichen
- TAudioVolume freigeben
- Es knallt, wenn die Interface-Instanz auf nil gesetzt wird.
Verstehe ich nicht. Der Proxy soll innerhalb von TAudioVolume als Objektreferenz gehalten werden, nicht als Interface. Erzeugen im Constructor und Freigeben im Destructor. TAudioVolume selbst implementiert dann gar kein Interface mehr und braucht auch nicht von TInterfacedObject/TInterfacedPersistent abzuleiten, sondern nur vom guten alten TObject .

Was intern mit dem Proxy passiert ist dadurch streng reguliert (da die Proxy Instanz privat ist, nie als Interface angesprochen wird und Erzeugung und Freigabe von TAudioVolume geregelt wird.
Aber auch nur, wenn Emil den Proxy von TInterfacedPersistent (oder System.Generics.Defaults.TSingletonImplementation) ableitet, ansonsten hat er wie im Post darüber zu lesen für ihn unverständliche Invalid Pointer Zugriffe und er resigniert.

Geändert von TiGü ( 8. Jun 2018 um 07:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: TWinControl via TInterfacedObject via TInterfacedPersistent

  Alt 8. Jun 2018, 12:50
Aber auch nur, wenn Emil den Proxy von TInterfacedPersistent (oder System.Generics.Defaults.TSingletonImplementation) ableitet, ansonsten hat er wie im Post darüber zu lesen für ihn unverständliche Invalid Pointer Zugriffe und er resigniert.
Stehe irgendwie auf dem Schlauch grade. Wenn er den Proxy als Klasseninstanz erzeugt und die Variable, in der er die Instanz speichert, auch vom Typ der Klasse (nicht des Interfaces) ist, dann sollte der RefCount doch eigentlich garantiert 0 sein. Außer natürlich, es werden an späterer Stelle doch noch (wie auch immer) AddRef Aufrufe generiert ... aber das sollte dann ja eigentlich nicht am Interface bzw. TInterfacedObject selbst liegen, sondern ein Programmierfehler sein, oder liege ich hier falsch?
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#18

AW: TWinControl via TInterfacedObject via TInterfacedPersistent

  Alt 8. Jun 2018, 13:04
Hast du dir schon mal überlegt, warum dieser Proxy-Typ
Delphi-Quellcode:
TAudioVolumeProxy = class( TInterfacedObject,
  IAudioVolume,
  IAudioSessionEvents,
  IMMNotificationClient,
  IAudioSessionNotification,
  IAudioEndpointVolumeCallback)
diese Interfacs in der Deklaration aufweist?

Evtl. weil die verwendet werden um sich z.B. an einem IAudioSessionControl per HRESULT RegisterAudioSessionNotification( [in] IAudioSessionEvents *NewNotifications ); anzumelden, weil diese Interfaces ansonsten nutzlos wären wenn man die gar nicht verwendet?
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: TWinControl via TInterfacedObject via TInterfacedPersistent

  Alt 8. Jun 2018, 13:12
Sehe ich kein Problem, sofern man ordnungsgemäß auch wieder UnregisterAudioSessionNotification verwendet. Ich meine "irgendwo" müssen die Referenzen doch geleaked werden. Die entstehen ja nicht von alleine. Dann einfach die Referenzzählung zu deaktivieren, indem man TInterfacedPersistence verwendet, kann doch eigentlich nicht Sinn der Sache sein.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl ( 8. Jun 2018 um 13:14 Uhr)
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#20

AW: TWinControl via TInterfacedObject via TInterfacedPersistent

  Alt 8. Jun 2018, 13:20
Wenn du dir selber aber die Interface Referenz nicht merkst
(dein Beispiel-Code)
Delphi-Quellcode:
TAudioVolume = class(TObject)
  strict private
    FProxy: TAudioVolumeProxy;
  strict protected
    FOnSessionCreate: TOnSessionCreate;
  public
    property OnSessionCreate: TOnSessionCreate read FOnSessionCreate write FOnSessionCreate;
  ...
und du gibst eine Interface-Referenz davon heraus, dann tickt ab da die RefCount-Bombe und die kann zu jedem Zeitpunkt platzen.
Delphi-Quellcode:
begin
  RegisterAudioSessionNotification(FProxy);
  UnregisterAudioSessionNotification(FProxy);
end; { bumm, wenn diese Methode verlassen wird, denn wird FProxy zerstört }
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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