Hallo an alle und guten Tag,
noch eine Frage zu Threads: Ich möchte, dass mein Hauptprogramm an einer bestimmten Stelle auf meinen Thread und dessen Ergebnisse wartet. Hier mal die wichtigen Quellcode:
Delphi-Quellcode:
function TV_Tische.ConnectionTest(ChangedComportList:TStringList; AllComportList: TStringList): boolean;
var i: integer;
begin
result := false;
case (FiComport > 0) of
true: begin
// hier kommt später noch Quellcode der überprüft, ob der Comport, mit welchem das Gerät arbeitet abgeschalten wurde (ist der Comport noch in AllComportList enthalten)
end;
false: begin
if ChangedComportList.Count > 0 then // gibt es Änderungen
begin
for i := 0 to ChangedComportList.Count - 1 do
begin
if strtoint(ChangedComportList[i]) > 0 then // welche Änderungen gibt es. Diese Liste wird in einem anderen Thread immer überprüft und über ein Event werden Änderungen in den Comports dem Hauptprogramm mitgeteilt. Dieses Event gibt aus bei welchen Comports Änderungen sich ergeben haben (dabei werden sich zuschlatende Comports mit positiven Zahlen entsprechend der Comportnummer in der Liste aufgenommen und abgeschaltene Comports mit negativen Zahlen)
begin
// es soll über einen bestimmten Zeitraum ein Kommando an den Controler über einen Thread geschickt werden und überprüft, ob dort eine entsprechende Resonanz auftritt.
FConnectionTest := TConnectionThread.create(strtoint(ChangedComportList[i]));
FConnectionTest.OnConnected := SetComPort; // Event welches ausgelöst wird, wenn eine Verbindung festgestellt wurde
FConnectionTest.OnTimeOut := SetTimeOut; // Event, welches ausgelöst wird, wenn die Testzeit überschritten wurde.
// Hier muss ich ja irgendwie warten und hier auf bezieht sich die Frage
end;
end;
end;
end;
end;
end;
// Hier noch der entsprechende Thread
Type TConnectionThread = class(TThread)
private
FFensterHandle: HWND;
FiComport:integer;
FOnConnected: TOnConnected;
FOnTimeOut: TOnTimeOut;
// Interaktionsfunktion mit Oberfläche
protected
// Ausführung
procedure Execute; override;
// EventHandling
procedure DoConnected;
procedure DoTimeOut;
public
// Initialisierung und Terminierung
constructor create(iComportNumber: integer); reintroduce;
destructor destroy; override;
// Events
property OnConnected: TOnConnected read FOnConnected write FOnConnected;
property OnTimeOut: TOntimeOut read FOnTimeOut write FOnTimeOut;
end;
implementation
uses TischUnit, VT_Funktionen;
constructor TConnectionThread.create(iComportNumber: integer);
var i: integer;
begin
inherited create(false);
FiComport := iComportNumber;
end;
destructor TConnectionThread.Destroy;
begin
inherited destroy;
end;
procedure TConnectionThread.Execute;
var bConnected: boolean;
c, i: integer;
begin
bConnected := false;
c := GetTickcount;
repeat
for i := 1 to 2 do
begin
MMC_setDevice(i);
if MST_moving = 1 then bConnected := true;
end;
if not bConnected then
begin
for i := 1 to 2 do
begin
MMC_setDevice(i);
MMC_SendCommand('FE2');
end;
end;
until (c > TestTime) or bConnected;
if bConnected then doConnected;
if c > TestTime then doTimeOut;
end;
procedure TConnectionThread.DoConnected;
begin
if assigned(FOnConnected) then FOnconnected(Self, FiComport);
end;
procedure TConnectionThread.DoTimeOut;
begin
if assigned(FOnTimeOut) then FOnTimeOut(Self);
end;
end.
Vieleicht hab ich nur gerade einen Knoten im Kopf, denn ich weiß schon, ich muss ja eigentlich nur auf das TimeOut-Event warten und dadurch einfach den nächsten Comport in der Liste aufrufen. Aber ich steh gerade im Wald und sehe keine Bäume, geschweige denn eine Lösung.
Hoffe jemand kann mir da einen Denkanstoß geben.
BAMatze
2. Account Sero