Einzelnen Beitrag anzeigen

BAMatze

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

Auf Thread warten ohne Programm zu blockieren

  Alt 29. Sep 2009, 11:50
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
  Mit Zitat antworten Zitat