Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi events und Listen (https://www.delphipraxis.net/104028-events-und-listen.html)

Alex2.2 26. Nov 2007 12:32


events und Listen
 
Hallo Leute,
Ich bin mal wieder am Ende meiner Weisheit. Ich betreibe gerade den verzweifelten Versuch einen Application Guardian zu schreiben. Dafür habe ich einen TCP IP Server und ein Client Object geschrieben. Der Client sendet beim Eintritt in einen zu kontrollierenden Codeabschnitt ein Signal an den Server, das eine Applcation Id, Thread Id, und Programcode Id und Zeitangabe enthält. Der Server baut eine Struktur aus Apllications, Threads und Codeparts auf und kontrolliert, ob die Codeabschnitte von den verschiedenen Applikationen, und Threads sich noch regulär verhalten. Die Kommunikation klappt ganz gut. Anhand von Kontrollausgaben war das deutlich zu sehen. Aber - und da liegt der Hund begraben - die Kontrollkomponenten, die ich hergestellt und von TComponent abgeleitet habe, enthalten verständlicherweise einen TTimer der bei irregulären Verhalten einen Timerevent feuert und genau den bekomme ich nicht durchgereicht bis zur Applikationsebene.

Hier die Komponente für Codeparts :
Delphi-Quellcode:
  TCodePart = class(TComponent)
  private
    FTimeOut: TTimer;
    FTimeLimitAlarm  : Boolean;
    FId      : Integer;
    FTimeLimitExeeded : TNotifyEvent;
    FSignal          : TGuardianSignal;
    procedure TimeOutTimer(Sender: TObject);
  public
    Property LastSignal        : TGuardianSignal read FSignal          write FSignal;
    { Public declarations }
  published
    constructor create(AOwner: TComponent); override;
    procedure Start;
    procedure Stop;
    procedure setTimeOut(Value: Integer);
    function getTimeOut: Integer;
    procedure setActive(Value: Boolean);
    function getActive: Boolean;
    Property TimeLimeExeeded   : Boolean        read FTimeLimitAlarm  write FTimeLimitAlarm;
    Property TimeLimit         : Integer        read getTimeOut       write SetTimeOut;
    Property Active            : Boolean        read getActive        write setActive;
    Property Id                : Integer        read FId      write FId;
    property onTimeLimitExeeded : TNotifyEvent   read FTimeLimitExeeded write FTimeLimitExeeded;
  end;
die Threadcontrollerkomponente ist davon abgeleitet
Delphi-Quellcode:
  TThreadModul = class(TCodePart)
  private
     FCodePartTimeout: TNotifyEvent;
     FCodePartList: TComponentList;

     ListSecure       : TCriticalSection;

     procedure CodePartTimeOut(Sender: TObject);
  public
     property CodeParts : TComponentList       read FCodePartList write FCodePartList;
  published
     constructor create(AOwner: TComponent); override;
     property onCodePartTimeout : TNotifyEvent read FCodePartTimeout write FCodePartTimeout;
     procedure enterCodePart(Signal: TGuardianSignal);
     procedure exitCodePart(Signal: TGuardianSignal);
     procedure refreshCodePart(Signal: TGuardianSignal);
     procedure StopAll;
  end;
Diese Codepartkomponente könnte, bei verschachtelten Funktionsaufrufen innerhalb der kontrollierten Application (oder des Threads gewissermaßen Teil eines Stacks sein. Daher muß ich mehrere Instanzen davon in einer Threadkontrollierenden Komponente vorsehen. Nur von welcher Komponente oder Klasse kann ich so einen "Stack" ableiten? TComponentlist, wie in den Listing zu sehen, scheint dafür nicht geeignet, weil die Eventhandler der TCodepart Componenten irgendwie verloren gehen.

Wer weiß da Rat?

Danke für Eure Hilfe

ChristianZ 27. Nov 2007 23:52

Re: events und Listen
 
Das ist vermutlich ein generelles Problem das bei Treads und Events von Componenten auftaucht.

Ich suche gerade selber nach einer solchen Lösung.
Um das Event zu nutzen, müsstest Du im Thread Application.ProcessMessages() aufrufen - in der Execute Routine des Threads.
Auf anderem Wege bin ich bisher nicht an die Events gekommen.

Falls sich ein Weg ergeben sollte, bin ich ebenfalls sehr interessiert.

Scheinbar ist es aber generell möglich, einem Thread Nachrichten zu schicken, wenn man ihm ein "Fenster" mit CreateWnd() erzeugt, und eine Ereignissbehandlungs routine.


Gruß
Christian

Muetze1 28. Nov 2007 09:53

Re: events und Listen
 
Zitat:

Zitat von ChristianZ
Um das Event zu nutzen, müsstest Du im Thread Application.ProcessMessages() aufrufen - in der Execute Routine des Threads.

Du willst den VCL Thread aus einem anderen Thread aus direkt anstossen bzw. aufrufen? Wie wäre es mit Synchronize? Schliesslich ist das der eigentliche Weg der Synchronisation von Events in den VCL Thread.

Zitat:

Zitat von ChristianZ
Auf anderem Wege bin ich bisher nicht an die Events gekommen.

Welche Events meinst du?

Zitat:

Zitat von ChristianZ
Scheinbar ist es aber generell möglich, einem Thread Nachrichten zu schicken, wenn man ihm ein "Fenster" mit CreateWnd() erzeugt, und eine Ereignissbehandlungs routine.

Behandelst du auch die anderen nötigen Nachrichten zur Fensterstellung?

Alex2.2 3. Jan 2008 14:05

Re: events und Listen
 
Ok. Das mit dem Syncronisieren war die Ursache, meiner Probleme. Ich habe geglaubt mit einem einfachen Mutex ist das Problem gelöst, war es jedoch nicht. Hier ist wirklich ein Syncronize notwendige gewesen. Zu dumm, aber Dank an alle


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 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-2025 by Thomas Breitkreuz