Autor Beitrag
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mo 17.11.03 21:33 
Also freigeben sollte man ihn schon, aber eigentliche Fehlerursache dürfte das nicht sein (wenn das wirklich das einzige ist wo du dyn. Speicher reservierst)...

Was ist TTCPThread für eine Klasse? Von dir oder von den Indys? (bin in Internet/Netzwerk-Programmierung nicht so bewandert). Wenn es eine Klasse von dir ist, wie schaut diese aus (Code)..?

BTW: was ist/macht das ganze eigentlich?

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
MrSaint Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Mo 17.11.03 22:09 
hmmm... also ich hab nun n freemem an entsprechender stelle drin, haat aber net wirklich was gebracht :(

TTCPThread is ne Klasse von mir, die von TThread abgeleited is. Das ganze soll mal ein ProxyServer werden. Dazu brauch ich ein TidTCPServer, der die Verbindungen Browser <-> Mein Programm. Dann brauch ich noch nen TIdTCPClient der die Verbindung Mein Programm <-> Webserver.
Wenn der Browser also ne anfrage schickt springt mein TCPServer ein. Da wird dann die Procedue OnExecute aufgerufen. Die klamausert bei mir dann die daten aauseinander und "bestückt" einen TCPClient damit... so weit so gut.
wenn jetzt der Webserver antwortet, muss mein TCPClient einspringen. Da gibts aber kein Ereignis dazu (OnServerWrite oder sowas), also muss man das mit nem Thread abfangen. Das macht mein TTCPThread. und da gibts dann für jede Instanz von TCPClient einen TCPThread der dann immer diese Verbindung auf neue Nachrichten überprüft. und wie schon gesagt gibts für jeden Thread vom TCPServer (Verbindung Browser <-> mein Programm) (das is der AThread) einen TCPThread und einen TCPClient.



jetzt poste ich hier mal die unit "thread.pas", die bei mir den kompletten TTCPThread beinhaltet (is nun nich auskommentiert und auch nich "schöngemacht [ also auskommentierte Linien entfernt etc.] ).

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:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
unit thread;

interface

uses Classes, IdTCPClient, IdTCPServer;

type    TTCPThread = class (TThread)
        private
          Buf:array [1..10240of byte;                 // Puffer
          BufSize,SizeToWrite:int64;                    // Puffergröße, Größe, die an Browser geschrieben werden soll
          FTCPClient:TIdTCPClient;                      // der TCPClient
          FAThreadClient:TIdPeerThread;                 // der TCPServer-Thread (Browser <-> Proxy)
          tolog:string;                                 // Hilfsvariable für's logging
          TerminateOK:boolean;                          // ist das TCPThread.Terminate OK?
          DisconnectOK: boolean;                        // Ist der Disconnect vom Webserver OK?
          procedure HandleInput;                        // schickt daten an Browser
          procedure log;                                // gibt inhalt von tolog aus
          procedure DeleteFromList;                     // löscht einen eintrag aus ThreadWork (den eigenen)
          procedure TCPThreadTerminate(Sender:TObject);
          procedure TCPClientDisconnect(Sender:TObject);
        protected
          procedure Execute; override;
        published
          property AThreadClient: TIdPeerThread read FAThreadClient write FAThreadClient;
          property TCPClient:TIdTCPClient read FTCPClient write FTCPClient;
          procedure EndWork;
        end;

implementation

uses mainFrm, SysUtils;

function ArrToStr(arr: array of byte;high:integer):string;
var i:integer;
begin
  result:='';
  i:=-1;
  while (i<high) do
  begin
    inc(i);
    result:=result+chr(arr[i]);
  end;
end;

procedure TTCPThread.Execute;
begin
  TerminateOK:=false;
  DisconnectOK:=false;
  OnTerminate:=TCPThreadTerminate;
  FTCPClient.OnDisconnected:=TCPClientDisconnect;
  tolog:='New Thread ID: TCPThread: '+inttostr(ThreadID)+'; AThread: '+inttostr(AthreadClient.ThreadID);
  Synchronize(log);
  while not Terminated do
  begin
    if not FTCPClient.Connected then
    begin
      EndWork;
//      FTCPClient.Connect;
    end else
    begin
      try
        FTCPClient.ReadBuffer(buf,1);
        BufSize:=FTCPClient.InputBuffer.Size;
        SizeToWrite:=1;
//        HandleInput;
        synchronize(HandleInput);
        if BufSize>0 then
        begin
          if BufSize>10240 then
          begin
            SizeToWrite:=10240;
            repeat
              FTCPClient.ReadBuffer(Buf,10240);
              Dec(BufSize,10240);
//              HandleInput;
              Synchronize(HandleInput);                                               // verarbeiten
            until BufSize<10240;
            if BufSize>0 then
            begin
              SizeToWrite:=BufSize;
              FTCPClient.ReadBuffer(Buf,BufSize);
              BufSize:=0;
//              HandleInput;
              Synchronize(HandleInput);
            end;
          end else
          begin
            SizeToWrite:=BufSize;
            FTCPClient.ReadBuffer(Buf,BufSize);
            BufSize:=0;
//            HandleInput;
            Synchronize(HandleInput);
          end;
        end else SizeToWrite:=0;
      except
//        EndWork;
      end;
    end;
  end;
end;

procedure TTCPThread.log;
begin
  FrmMain.log(tolog);
end;

procedure TTCPThread.HandleInput;                                               // PUFFER-VERARBEITUNG
begin
  if SizeToWrite=0 then exit;
  AThreadClient.Connection.WriteBuffer(Buf,SizeToWrite);
//  FrmMain.log('Writing: '+ArrToStr(buf,SizeToWrite));
end;

procedure TTCPThread.DeleteFromList;
var i:integer;
    ThreadWorkHelp:PThreadWork;
    TCPThreadInList:TTCPThread;
begin
//  FrmMain.log('TCPThread.DeleteFromList');
  tolog:='TCPThread.DeleteFromList - ID: TCPThread: '+inttostr(ThreadID)+'; AThread: '+inttostr(AThreadClient.ThreadID);
  Synchronize(log);
  i:=-1;
  try
    with ThreadWork.LockList do
    begin
      while (i<Count-1do
      begin
        inc(i);
        ThreadWorkHelp:=Items[i];
        TCPThreadInList:=ThreadWorkHelp.TCPThread;
        if TCPThreadInList.ThreadID=ThreadID then
        begin
          tolog:='TCPThread.DeleteFromList - Deleted Thread #'+inttostr(i)+'; ID: TCPThread: '+inttostr(ThreadID)+'; AThread: '+inttostr(AthreadClient.ThreadID);
          Synchronize(log);
          FreeMem(ThreadWorkHelp);
          Delete(i);
          break;
        end else
        begin
//          tolog:='TCPThread.DeleteFromList - Checking Thread #'+inttostr(i)+' - no match';
//          Synchronize(log);
//          FrmMain.log('TCPThread.DeleteFromList - Checking Thread #'+inttostr(i)+' - No match');
        end;
      end;
    end;
  finally
    ThreadWork.UnlockList;
  end;
  tolog:='TCPThread.DeleteFromList - ID: TCPThread: '+inttostr(ThreadID)+'; AThread: '+inttostr(AThreadClient.ThreadID)+' DONE';
  Synchronize(log);
end;

procedure TTCPThread.EndWork;
begin
  tolog:='TCPThread.EndWork - ID: TCPThread: '+inttostr(ThreadID)+'; AThread: '+inttostr(AthreadClient.ThreadID);
  Synchronize(log);
  try
//    Synchronize(DeleteFromList);
    DeleteFromList;
  except
  end;
  try
    FTCPClient.Free;
{    DisconnectOK:=true;
    try
      FTCPClient.Disconnect;
    except
    end;
    repeat until not FTCPClient.Connected;
    try
      FTCPClient.Free;
    except
    end;
{    if AThreadClient.Data<>nil then
    try                     // damit nicht beide Seiten sich gegenseitig disconnecten!
      tolog:='TCPThread.EndWork - AThread.Connection.Disconnect';
      Synchronize(log);
      AThreadClient.Connection.Disconnect;
    except
    end;}

  except
  end;
  TerminateOK:=true;
  Terminate;
end;

procedure TTCPThread.TCPThreadTerminate(Sender:TObject);
begin
  //Dummy
  if not TerminateOK then EndWork;
end;

procedure TTCPThread.TCPClientDisconnect(Sender:TObject);
begin
  //dummy
{  if not DisconnectOK then
  begin}

    tolog:='TCPClient.Disconnect - ID: TCPThread: '+inttostr(ThreadID);
    synchronize(log);
    try
      AThreadClient.Connection.Disconnect;
    except
    end;
//  end;
end;

end.



Ich hoff, dass das irgendwas hilft...


hab nun bald den kompletten source hier gepostet.-.. könnte demnächst eigentlich auch den ganzen Project-Source ins Netz stellen ;)



MrSaint

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mo 17.11.03 23:47 
Ich hab mir das mal angeschaut und zum besseren Verständnis auch gleich mal an meinen Stil angepasst.. ;)
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:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
unit thread;

interface

uses
  Classes, IdTCPClient, IdTCPServer;

const
  MAX_COUNT = 10240;

type
  TTCPThread = class (TThread)
    private
      Buf: array [1..MAX_COUNT] of Byte;   // Puffer
      SizeToWrite: Int64;                  // Puffergröße, Größe, die an Browser geschrieben werden soll
      FTCPClient: TIdTCPClient;            // der TCPClient
      FAThreadClient: TIdPeerThread;       // der TCPServer-Thread (Browser <-> Proxy)
      ToLog: String;                       // Hilfsvariable für's logging
      TerminateOK: Boolean;                // ist das TCPThread.Terminate OK?
      DisconnectOK: Boolean;               // Ist der Disconnect vom Webserver OK?
      procedure HandleInput;               // schickt daten an Browser
      procedure log;                       // gibt inhalt von tolog aus
      procedure DeleteFromList;            // löscht einen eintrag aus ThreadWork (den eigenen)
      procedure TCPThreadTerminate(Sender: TObject);
      procedure TCPClientDisconnect(Sender: TObject);
    protected
      procedure Execute; override;
    published
      property AThreadClient: TIdPeerThread read FAThreadClient write FAThreadClient;
      property TCPClient:TIdTCPClient read FTCPClient write FTCPClient;
      procedure EndWork;
    end;

implementation

uses
  mainFrm, SysUtils;

function ArrToStr(arr: array of byte; high: Integer): String;
var
  i: Integer;
begin
  Result := '';
  i := -1;
  while (i < high) do
  begin
    inc(i);
    Result := Result + Chr(arr[i]);
  end;
end;

procedure TTCPThread.Execute;
var
  BufSize: Int64;
begin
  TerminateOK := False;
  DisconnectOK := False;
  OnTerminate := TCPThreadTerminate;
  FTCPClient.OnDisconnected := TCPClientDisconnect;
  ToLog := 'New Thread ID: TCPThread: ' + IntToStr(ThreadID) +
           '; AThread: ' + IntToStr(AthreadClient.ThreadID);
  Synchronize(log);

  while not Terminated do
  begin
    if not FTCPClient.Connected then
    begin
      Terminate;
//      FTCPClient.Connect;
    end else
    begin
      try
        FTCPClient.ReadBuffer(Buf, 1);
        BufSize := FTCPClient.InputBuffer.Size;
        SizeToWrite := 1;
        Synchronize(HandleInput);

        SizeToWrite := 0;
        if BufSize > 0 then
        begin
          if BufSize > MAX_COUNT then
          begin
            SizeToWrite := MAX_COUNT;
            repeat
              FTCPClient.ReadBuffer(Buf, MAX_COUNT);
              Dec(BufSize, MAX_COUNT);
              Synchronize(HandleInput); // verarbeiten
            until BufSize < MAX_COUNT;
          end;

          if BufSize > 0 then
          begin
            SizeToWrite := BufSize;
            FTCPClient.ReadBuffer(Buf, BufSize);
            BufSize := 0;
            Synchronize(HandleInput);
          end;
        end;
      except
//        EndWork;
      end;
    end;
  end;
end;

procedure TTCPThread.log;
begin
  FrmMain.log(ToLog);
end;

procedure TTCPThread.HandleInput; // PUFFER-VERARBEITUNG
begin
  if SizeToWrite <> 0 then
    AThreadClient.Connection.WriteBuffer(Buf, SizeToWrite);
//  FrmMain.log('Writing: '+ArrToStr(buf,SizeToWrite));
end;

procedure TTCPThread.DeleteFromList;
var
  i: Integer;
  ThreadWorkHelp: PThreadWork;
  TCPThreadInList: TTCPThread;
begin
//  FrmMain.log('TCPThread.DeleteFromList');
  ToLog := 'TCPThread.DeleteFromList - ID: TCPThread: ' + IntToStr(ThreadID) +
           '; AThread: ' + IntToStr(AThreadClient.ThreadID);
  Synchronize(log);

  i := -1;
  try
    with ThreadWork.LockList do
    begin
      while (i < Count-1do
      begin
        Inc(i);
        ThreadWorkHelp := Items[i];
        TCPThreadInList := ThreadWorkHelp.TCPThread;
        if TCPThreadInList.ThreadID = ThreadID then
        begin
          ToLog := 'TCPThread.DeleteFromList - Deleted Thread #' + IntToStr(i) +
                   '; ID: TCPThread: '+ IntToStr(ThreadID) +
                   '; AThread: ' + IntToStr(AthreadClient.ThreadID);
          Synchronize(log);
          FreeMem(ThreadWorkHelp);
          Delete(i);
          break;
        end else
        begin
//          tolog:='TCPThread.DeleteFromList - Checking Thread #'+inttostr(i)+' - no match';
//          Synchronize(log);
//          FrmMain.log('TCPThread.DeleteFromList - Checking Thread #'+inttostr(i)+' - No match');
        end;
      end;
    end;
  finally
    ThreadWork.UnlockList;
  end;
  ToLog := 'TCPThread.DeleteFromList - ID: TCPThread: ' + IntToStr(ThreadID) +
           '; AThread: ' + IntToStr(AThreadClient.ThreadID) + ' DONE';
  Synchronize(log);
end;

procedure TTCPThread.EndWork;
begin
  ToLog := 'TCPThread.EndWork - ID: TCPThread: ' + IntToStr(ThreadID) +
           '; AThread: ' + IntToStr(AthreadClient.ThreadID);
  Synchronize(log);
  try
    DeleteFromList;
  except
  end;
  try
    FTCPClient.Free;
{    DisconnectOK:=true;
    try
      FTCPClient.Disconnect;
    except
    end;
    repeat until not FTCPClient.Connected;
    try
      FTCPClient.Free;
    except
    end;
{    if AThreadClient.Data<>nil then
    try                     // damit nicht beide Seiten sich gegenseitig disconnecten!
      tolog:='TCPThread.EndWork - AThread.Connection.Disconnect';
      Synchronize(log);
      AThreadClient.Connection.Disconnect;
    except
    end;}

  except
  end;
  TerminateOK := True;
  Terminate;
end;

procedure TTCPThread.TCPThreadTerminate(Sender:TObject);
begin
  //Dummy
  if not TerminateOK then
    EndWork;
end;

procedure TTCPThread.TCPClientDisconnect(Sender:TObject);
begin
  //dummy
{  if not DisconnectOK then
  begin}

    ToLog := 'TCPClient.Disconnect - ID: TCPThread: ' + IntToStr(ThreadID);
    Synchronize(log);
    try
      AThreadClient.Connection.Disconnect;
    except
    end;
//  end;
end;

end.

Hab ein paar Sachen ein bisschen geändert/optimiert, aber ob es wirklich was gebracht hat weiß ich nicht... aber nachdem du ja eh alles mitlogst.. wie schaut den nun die Ausgabe in so einer Log-Datei aus? Vielleicht kann man daraus Rückschlüsse ziehen...

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
MrSaint Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Di 18.11.03 15:20 
hmmmm... äußerst komisch... hab zuerst deinen code hier bei mir reingepackt (von der unit) und dann ausgeführt... wegen fehler / AV hat sich nix gebessert... aber dann hab ich delphi neugestartet und nochmal probiert (wegen logdatei) und da hab ich jetzt gar keinen Fehler bekommen, mein Programm is aber trotzdem "eingefroren".... hab jetzt leider keine zeit, nach dem grund zu suchen, warum da jetzt kein fehler kam, weil ich gleich wieder weg muss.... hier aber mal die log-datei:


LOG hat folgendes geschrieben:
14:16:01 TCPServer.Execute
14:16:02 Created new thread #0
14:16:02 REQUEST: www.delphi-forum.de/ [217.160.166.23:80]
14:16:02 New Thread ID: TCPThread: 4294071443; AThread: 4294073091
14:16:02 TCPServer.Execute
14:16:04 TCPClient.Disconnect - ID: TCPThread: 4294071443
14:16:04 TCPThread.EndWork - ID: TCPThread: 4294071443; AThread: 4294073091
14:16:04 TCPThread.DeleteFromList - ID: TCPThread: 4294071443; AThread: 4294073091
14:16:04 TCPThread.DeleteFromList - Deleted Thread #0; ID: TCPThread: 4294071443; AThread: 4294073091
14:16:04 TCPThread.DeleteFromList - ID: TCPThread: 4294071443; AThread: 4294073091 DONE
14:16:04 TCPServer.Disconnect
14:16:04 TCPServer.Disconnect - ThreadWork empty!
14:16:04 TCPServer.Execute
14:16:04 TCPServer.Execute
14:16:04 TCPServer.Execute
14:16:04 TCPServer.Execute
14:16:04 TCPServer.Execute
14:16:04 TCPServer.Execute
14:16:04 TCPServer.Execute
14:16:04 TCPServer.Execute
14:16:04 TCPServer.Execute
14:16:04 Created new thread #0
14:16:04 REQUEST: www.delphi-forum.de/.../slices/slice-02.gif [217.160.166.23:80]
14:16:04 Created new thread #1
14:16:04 REQUEST: www.delphi-forum.de/.../slices/slice-03.gif [217.160.166.23:80]
14:16:04 Created new thread #2
14:16:04 REQUEST: www.delphi-forum.de/.../slices/slice-04.gif [217.160.166.23:80]
14:16:04 Created new thread #3
14:16:04 REQUEST: www.delphi-forum.de/.../slices/slice-05.gif [217.160.166.23:80]
14:16:04 Created new thread #4
14:16:04 REQUEST: www.delphi-forum.de/.../slices/slice-09.gif [217.160.166.23:80]
14:16:04 Created new thread #5
14:16:04 REQUEST: www.delphi-forum.de/.../slices/slice-10.gif [217.160.166.23:80]
14:16:04 Created new thread #6
14:16:04 TCPServer.Execute
14:16:04 TCPServer.Execute
14:16:04 REQUEST: www.delphi-forum.de/.../slices/slice-14.gif [217.160.166.23:80]
14:16:04 Created new thread #7
14:16:04 TCPServer.Execute
14:16:04 TCPServer.Execute
14:16:04 Created new thread #8
14:16:05 TCPServer.Execute
14:16:05 TCPServer.Execute
14:16:05 REQUEST: www.delphi-forum.de/.../slices/slice-01.gif [217.160.166.23:80]
14:16:05 New Thread ID: TCPThread: 4217591655; AThread: 4217669219
14:16:05 New Thread ID: TCPThread: 4217590351; AThread: 4217667811
14:16:05 TCPServer.Execute
14:16:05 New Thread ID: TCPThread: 4217590995; AThread: 4217668531
14:16:05 New Thread ID: TCPThread: 4217589691; AThread: 4217683459
14:16:05 New Thread ID: TCPThread: 4217589047; AThread: 4217682723
14:16:05 New Thread ID: TCPThread: 4217588387; AThread: 4217681987
14:16:05 New Thread ID: TCPThread: 4217587727; AThread: 4217681267
14:16:05 New Thread ID: TCPThread: 4217587051; AThread: 4217670427
14:16:05 New Thread ID: TCPThread: 4217586407; AThread: 4217669783
14:16:04 TCPServer.Execute
14:16:04 REQUEST: www.delphi-forum.de/.../slices/slice-27.gif [217.160.166.23:80]
14:16:05 Created new thread #9
14:16:05 TCPServer.Execute
14:16:05 TCPServer.Disconnect
14:16:05 TCPServer.Execute
14:16:05 TCPServer.Disconnect
14:16:05 TCPServer.Disconnect
14:16:05 TCPServer.Disconnect
14:16:05 TCPServer.Execute
14:16:05 TCPServer.Execute
14:16:05 REQUEST: www.delphi-forum.de/.../slices/slice-11.gif [217.160.166.23:80]
14:16:06 New Thread ID: TCPThread: 4217599323; AThread: 4217585671
14:16:06 TCPClient.Disconnect - ID: TCPThread: 4217591655
14:16:06 TCPClient.Disconnect - ID: TCPThread: 4217590351
14:16:06 TCPClient.Disconnect - ID: TCPThread: 4217589691
14:16:06 TCPClient.Disconnect - ID: TCPThread: 4217589047
14:16:05 TCPServer.Execute
14:16:06 TCPClient.Disconnect - ID: TCPThread: 4217588387
14:16:05 TCPServer.Execute
14:16:06 TCPClient.Disconnect - ID: TCPThread: 4217590995
14:16:06 TCPServer.Disconnect - Client-Disconnect Thread #0; ID: TCPThread: 4217591655; AThread: 4217669219
14:16:06 TCPServer.Disconnect
14:16:06 TCPServer.Disconnect
14:16:06 TCPClient.Disconnect - ID: TCPThread: 4217587727
14:16:06 TCPThread.EndWork - ID: TCPThread: 4217590995; AThread: 4217668531
14:16:06 TCPThread.DeleteFromList - ID: TCPThread: 4217590995; AThread: 4217668531


...Aber es wurde wieder die DeleteFromList als letztes aufgerufen.... irgendwie is das alles sehr verwirrend :eyecrazy:

MrSaint

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems