Autor Beitrag
RBiniasch
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Do 11.06.09 18:25 
Hallo,

ich habe ein kleines Verständnisproblem bezüglich der Funktionsweise eines Threads unter Delphi.

Erstmal zum Hintergrund. Ich habe hier ein über mehrere Dienste verteiltes Schnittstellensystem geschrieben, bei dem die einzelnen Arbeitsdienste über einen zentralen Dienst miteinander kommunizieren. Damit die interne Kommunikation nicht die eigentliche Funktion der Dienste beeinträchtigen kann hat jeder einen zusätzlichen Thread, welcher die hereinkommenden Nachrichten verarbeitet. Das funktioniert soweit ganz gut.

Heute ist mir nur aufgefallen, dass die Erkennung, ob ein Connect zum zentralen Dienst besteht, sich etwas seltsam verhält.

Dies ist die 'Execute'-Procedure des Threads :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TtoIFComThread.Execute;
begin
  inherited;

  if not Assigned(F_toTCPIPIFClient) then
    Exit;

  while not Terminated do
  begin
    if ConnectToComSvr then
    begin
      F_cardLastConnect    := GetTickCount;

      if F_toCom.DataReceived(F_toTCPIPIFClient) > 0 then
        ProcessTCPIPMsg;

      if F_bSendStatus then
        SendStatusMsg;
    end;
  end;
end;



Dies ist die einzige Stelle an der ConnectToComSvr aufgerufen wird. Darin überprüft der Thread ob er mit dem zentralen Dienst verbunden ist. Falls nicht versucht er die Verbindung aufzubauen.
Das sah so aus :

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
function TtoIFComThread.ConnectToComSvr: Boolean;
begin
  Result  := TRUE;
  try
    if (not F_toTCPIPIFClient.Connected) and
       ((GetTickCount-F_cardLastTry) > IF_CONST_MAXWAITFORREPLY) then
    begin
      LogEvent(g_astrIFComBase[29],
               'TtoIFComThread.ConnectToComSvr',
               etInfo,
               IF_CONST_LOGLEVEL_MAX);

      F_cardLastTry  := GetTickCount;

      if (F_strComSvrIP <> EmptyStr) and
         (F_iComSvrPort > IF_CONST_NODATA_INT) then
      begin
        F_toTCPIPIFClient.Host  := F_strComSvrIP;
        F_toTCPIPIFClient.Port  := F_iComSvrPort;

        try
          F_toTCPIPIFClient.Connect(IF_CONST_WAITFORCONNECT);
        except
          on excError: Exception do
          begin
            LogEvent((Format(g_astrIFComErrors[0], [F_toTCPIPIFClient.Host,
                                                    F_toTCPIPIFClient.Port]) + ' ' + excError.Message),
                      'TtoIFComThread.ConnectToComSvr',
                      etError,
                      IF_CONST_LOGLEVEL_MIN);
            Result  := FALSE;
            Exit;
          end;
        end;
      end
      else
      begin
        LogEvent(Format(g_astrIFComErrors[9], [F_strComSvrIP, F_iComSvrPort]),
                 'TtoIFComThread.ConnectToComSvr',
                 etError,
                 IF_CONST_LOGLEVEL_MIN);
        Result :=FALSE;
      end;

      LogEvent(g_astrIFComBase[30],
               'TtoIFComThread.ConnectToComSvr',
               etInfo,
               IF_CONST_LOGLEVEL_MAX);
    end;
  except
    on excError: Exception do
    begin
      LogEvent((Format(g_astrIFComErrors[0], [F_toTCPIPIFClient.Host,
                                              F_toTCPIPIFClient.Port]) + ' ' + excError.Message),
                'TtoIFComThread.ConnectToComSvr',
                etError,
                IF_CONST_LOGLEVEL_MIN);
      Result  := FALSE;
    end;
  end;
end;


Das Problem ist, dass die Funktion anscheinend immer TRUE zurück gibt. Selbst wenn ich im Debuger gesehen habe, dass der Rückgabewert unmittelbar vor dem Verlassen auf FALSE stand.
Inzwischen habe ich die Geschichte geändert, so das immer F_toTCPIPIFClient.Connected zurück kommt. damit funkioniert alles. Eine Erklärung fehlt mir aber. Vielleicht weiß hier ja jemand, wo das Problem liegt.

Danke und viele Grüße,
rb