Einzelnen Beitrag anzeigen

BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#1

Thread mit Überwachungsfunktion wird blockiert

  Alt 1. Sep 2009, 12:30
Hallo und guten Tag an alle,

ich hab mal wieder eine Frage bezüglich TThread. Und zwar habe ich in Bezug auf diesen Threat meine Überwachungsfunktion für das derzeitige Projekt aus dem Timer (TControlerBoard.fdigEingaenge_pruefen(Sender: TObject); = Timerfunktion) ausgelagert und in einen Thread verfrachtet. Nun ergeben sich aber einige Problem gerade beim Laden des Programmes.

Bevor ich zur Problembeschreibung komme hier mal mein Thread-Rumpf, den ich nach einer Vorlage hier aus der DP genommen hab:

Delphi-Quellcode:
unit SteuerkartenKontrollThread;

interface

uses Classes, ExtCtrls;

Type TOndigEingang = procedure(Sender: TObject; iChannel: integer) of Object;
     TOnanaEingang = procedure(Sender: TObject; iChannel, iWert: integer) of Object;

Type TControlCardControlThread = class(TThread)
  private
    Timer: TTimer;
    FOndigEingang: TOndigEingang;
    FOnanaEingang: TOnanaEingang;
  protected
    procedure Waechter(Sender: TObject);
    procedure Execute;
    procedure dodigEingang(iChannel: integer);
    procedure doanaEingang(iChannel, iWert: integer);
  public
    constructor create; reintroduce;
    destructor destroy; override;
    property OndigEingang: TOndigEingang read FOndigEingang write FOndigEingang;
    property OnanaEingang: TOnanaEingang read FOnanaEingang write FOnanaEingang;
end;

implementation
uses Steuerkarte;

constructor TControlCardControlThread.create;
begin
  inherited create(false);
  Timer := TTimer.Create(nil);
  Timer.Enabled := true;
  Timer.Interval := 50;
  Timer.OnTimer := Waechter;
  // weitere Kommandos
end;

destructor TControlCardControlThread.Destroy;
begin
  Timer.Free;
  inherited destroy;
end;

procedure TControlCardControlThread.Execute;
var iIndex: integer;
begin
  Timer := TTimer.Create(nil);
  Timer.Enabled := true;
  Timer.Interval := 50;
  Timer.OnTimer := Waechter;
end;

procedure TControlCardControlThread.Waechter(Sender: TObject);
begin
  if ReadDigitalChannel(2) then dodigEingang(2); //hier wird derzeit eins von mehreren Events initialisiert // funktioniert
end;

procedure TControlCardControlThread.dodigEingang(iChannel: Integer);
begin
  if assigned(FOndigEingang) then FOndigEingang(Self, iChannel);
end;

procedure TControlCardControlThread.doanaEingang(iChannel: Integer; iWert: Integer);
begin
  if assigned(FOnanaEingang) then FOnanaEingang(Self, iChannel, iWert);
end;

end.
Ok zuersteinmal, weiß ich sicherlich nicht, ob diese Variante des Threads wirklich sehr "gelungen" ist. Weiß aber derzeit nicht, ob es eine bessere Alternative zu dem Timer gibt, den ich für die zyklische Abfrage meines digitalen Einganges gibt (Vorschläge werden gern angenommen).
Jetzt zu dem Problem. Die digitalen Eingänge sitzen auf einem Controlerboard, welches mir den Strom für die weitere Perepherie-Geräte freischaltet (und natürlich auch wieder ausschaltet). Dies funktioniert auch sehr gut, wenn das Programm läuft. Allerdings wenn das Programm startet, reagiert er überhaupt nicht.
Woran das liegt kann ich mir in einem gewissen Rahmen auch denken. Habe ein Splashscreen, welches in einer Schleife "ein- und ausgeblendet" wird und es werden weitere Perepherie-Geräte initialisiert.
Wie kann ich jetzt auch bei der Implementierung das Programm dazu zwingen auf die Events, die in meinem Thread erzeugt werden zu reagieren. Ich weiß ich kann Application.ProcessMessages verwenden, was mir aber nur in Teilen hilft. Z.B. wenn das im Ein- und Ausblenden der Splashscreen steht, führt es zu regelmäßigem Einfrieren des Programmes, welches nur durch das rote viereckige Kästchen in Delphi beendet werden kann. Weiterhin müssten ja grundsätzlich dann in jede Procedure welche nach dem ControlerBoard ausgeführt wird diese Application.ProcessMessages aufgerufen werden, was ein erheblicher Arbeitsaufwand wäre.
Gibt es irgendwelche anderen Möglichkeiten, das Programm zum Reagieren zu zwingen?

Vielen Dank
BAMatze
2. Account Sero
  Mit Zitat antworten Zitat