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