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



BeitragVerfasst: Mi 21.06.06 20:13 
Hi@all!

Man stelle sich folgendes vor: Ich habe einen TCPClient, der brav an den Server daten schickt. Das OnDisconnected Ereignis hab ich mit einer Prozedur verbunden, die momentan nix anderes macht, als einen Interger Counter hochzuzählen (inc(Counter))

Wenn ich jetz drei mal nach einander Daten verschicke bleibt der Counter auf dem Wert 0, daraus schließe ich jetzt mal, dass OnDisconnected gar nicht nach beenden des Übertragens aufgerufen wird...kann mir da jemand was zu erklären?

Imprinzip wollte ich folgendes machen: Während des Sendens soll es möglich sein, weitere Dateien zu verschicken. Und das wie folgt: Die noch zu versendenden Packete werden in einer Warteschleife gespeichert und sollen nacheinander an verschiedene Rechner (Server) verschickt werden, sobald die bestehende Verbindung beendet wird.

Das ganze sieht 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:
62:
63:
  TQUEUE = class
    pack:TPACKAGE; //Im wesentlichen ein MemoryStream
    Host:String;
    next:TQUEUE;
  end;

[...]
var queue1:Tqueue; 

[...]
//On Create:
queue1:=NIL;


[...]
procedure AddToQueue(pack:TPACKAGE;Host:String);

var GoThroughQueue,NewQueueElement:TQUEUE;
begin

if queue1=nil then
  if not TCPClient1.connected then sendpackage(pack,host) 
//sendet das Packet direkt, falls kein Element in der Schlange ist

     else begin
        queue1:=TQUEUE.Create;
        queue1.pack:=pack;
        queue1.Host:=Host;
        queue1.next:=NIL;
     end
  else begin {queue1 <> Nil}
        NewQueueElement:=TQUEUE.Create;
        NewQueueElement.pack:=pack;
        NewQueueElement.Host:=Host;
        NewQueueElement.Next:=Nil;

        GoThroughQueue:=queue1;
        while GoThroughQueue.Next<>NIL do
          GoThroughQueue:=GoThroughQueue.Next;
        GoThroughQueue.Next:=NewQueueElement;
  end;

end;


[...]

//Nun soll beim Disconnect vom TCPClient ein Packet nach dem anderen gesendet werden:

TCPClient1.OnDisconnected:=ExecuteQueue;


procedure ExecuteQueue(Sender:Tobject);
begin
    counter:=counter+1;

 if not (queue1=nilthen begin
  SendPackage(queue1.pack,queue1.Host);
  queue1:=queue1.next;
 end;  


end;


Leider wird nix gesendet, das ganze funktioniert nur solange Queue1=Nil ist, ExecuteQueue wird scheinbar nicht aufgerufen?!?

Kann mir jemand helfen?

Liebe Grüße,
ALleinherrscher
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Fr 23.06.06 09:02 
OnDisconnect wird IMHO nur aufgerufen, wenn der Client/Server die Verbindung beendet wird und nicht wenn nur keine Daten mehr übertragen werden.

Beim anderen weiß ich aber auch nicht bescheid wie man das am besten macht...
alleinherrscher Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Fr 23.06.06 16:35 
user profile icondigi_c hat folgendes geschrieben:
OnDisconnect wird IMHO nur aufgerufen, wenn der Client/Server die Verbindung beendet wird und nicht wenn nur keine Daten mehr übertragen werden.

Beim anderen weiß ich aber auch nicht bescheid wie man das am besten macht...


Danke, für deine Antwort :) Wäre schön, wenn OnDisconnect aufgerufen wird, wenn die Verbindung zwischen Client/Server beendet wird, denn: Sobald bei mir ein Datenpacket verschickt wurde (von Clinet an Server) schließt der Client die Verbindung, und müsste doch dann direkt in die OnDisconnect routine springen, und von dort aus über "sendpackage(...)" praktisch sich selber neu Verbinden, falls packete in der Warteschlange sind...
alias5000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: Fr 23.06.06 17:58 
Du meinst vllcht eher sowas wie OnWorkEnd?

_________________
Programmers never die, they just GOSUB without RETURN
alleinherrscher Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Fr 23.06.06 19:25 
user profile iconalias5000 hat folgendes geschrieben:
Du meinst vllcht eher sowas wie OnWorkEnd?


Ich suche imprinzip nen Event aus was ausgeführt wird, wenn der Client die Verbindung getrennt hat, um dann ne neue Verbindung herstellen zu können.

Wenn ich mit OnWorkEnd arbeite kommt leider die Meldung "Already Connected", nur um das nochmal zu erklären:

Ich möchte nicht mehrere Streams mit einer Verbindung verschicken. Die Verbindung soll jedes mal vor dem Verschicken getrennt sein und dann neu aufgebaut werden, da jeder Stream theoretisch an einen anderen Server (also Computer mit IP) gesendet werden kann.

Viele Grüße