Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi problem mit VCL port -> nonVCL (tcp) (https://www.delphipraxis.net/40840-problem-mit-vcl-port-nonvcl-tcp.html)

Beckman 21. Feb 2005 21:15


problem mit VCL port -> nonVCL (tcp)
 
//communikation mit GUI/client funkt, mit cmdline/client net.

also geschickt werden die texte, aber empfangen wird einfach nix.
server ist allerdings in ordnung, weil beim gui/clienten funkt es ja...

die loesung hab ich irgendwo im net gefunden fuer den indy tcpclienten, nur porten tuts net so richtig :/

jo, ich brauchs cmdline.


waer dankbar fuer hilfe.....



GUI/client:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ScktComp, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Memo1: TMemo;
    Edit3: TEdit;
    TCP: TIdTCPClient;
    procedure Edit3KeyPress(Sender: TObject; var Key: Char);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    procedure SendLine(Src: String);
  end;

  TClientHandleThread = class(TThread)
  private
    Message: String;
    procedure HandleInput;
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;
  ClientHandleThread: TClientHandleThread;

implementation

{$R *.dfm}

procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
if (key = #13) then begin
  memo1.lines.add('OUT: ' + edit3.Text);
  SendLine(edit3.text);
  edit3.clear;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
tcp.Disconnect;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if tcp.Connected then begin
  memo1.lines.add('already connected');
  exit;
  end;
TCP.Host := edit1.Text;
TCP.Port := strtoint(edit2.Text);
try
  TCP.Connect(3000);
  ClientHandleThread := TClientHandleThread.Create(True);
  ClientHandleThread.FreeOnTerminate:=True;
  ClientHandleThread.Resume;
except
  showmessage('error!');
  end;
end;

procedure TForm1.SendLine(Src: String);
begin
tcp.WriteInteger(length(Src));
tcp.Write(src);
end;

procedure TClientHandleThread.HandleInput;
begin
form1.memo1.lines.add('IN: ' + Message);
end;

procedure TClientHandleThread.Execute;
begin
  while not Terminated do
  begin
    if not Form1.TCP.Connected then
      Terminate
    else
    try
      Message := Form1.TCP.ReadString(Form1.TCP.ReadInteger);
      Synchronize(HandleInput);
    except
    end;
  end;
end;

end.






CMDLINE/client:


Delphi-Quellcode:
program becmac;

{$APPTYPE CONSOLE}

uses
  SysUtils, Windows, IdTCPClient, Classes;

type
  TClientHandleThread = class(TThread)
  private
    Message: String;
    procedure HandleInput;
  protected
    procedure Execute; override;
  end;

var
  TCP: TIdTCPClient;
  ClientHandleThread: TClientHandleThread;

procedure SendLine(Src: String);
begin
tcp.WriteInteger(length(Src));
tcp.Write(src);
end;

procedure TClientHandleThread.HandleInput;
begin

writeln('IN: ' + Message);

end;

procedure TClientHandleThread.Execute;
begin
  while not Terminated do
  begin
    if not TCP.Connected then
      Terminate
    else
    try
      Message := TCP.ReadString(TCP.ReadInteger);
      Synchronize(HandleInput);
    except
    end;
  end;
end;

begin

TCP := TIdTCPClient.Create(nil);
ClientHandleThread := nil;
TCP.Host := <HOST>;
TCP.Port := <PORT>;
try
  TCP.Connect(5000);
  ClientHandleThread := TClientHandleThread.Create(True);
  ClientHandleThread.FreeOnTerminate := True;
  ClientHandleThread.Resume;
except
  ClientHandleThread.Free;
  TCP.Free;
  writeln('Connection failed...');
  Exit;
  end;

-----------------------------------



//da hat er halt schleifen wo er wartet, bis gewisse strings gekommen sind
//mit sleep(1)




-----------------------------------




//exit
Sendline('BYE');
ClientHandleThread.Free;
TCP.Free;

end.

GuenterS 21. Feb 2005 21:43

Re: problem mit VCL port -> nonVCL (tcp)
 
füge nach...
ClientHandleThread.Resume;

noch
ClientHandleThread.WaitFor;

ein, dann hast bessere Chancen dass es funktioniert.


das ClientHandleThread.Free würd ich wegmachen, da Du FreeOnTerminate auf true setzt ... entweder das eine oder das andere.

[Nachtrag]
-----------------------------------



//da hat er halt schleifen wo er wartet, bis gewisse strings gekommen sind
//mit sleep(1)




-----------------------------------


das habe ich in Deinem Quellcode übersehen...
[/Nachtrag]

Beckman 21. Feb 2005 22:05

Re: problem mit VCL port -> nonVCL (tcp)
 
k, das free hab ich weg getan.

dann war endlich das := nil; als initialization nicht mehr notwendig :)


aber das waitfor tuts nich wirklich, so tut er ja dann nich weiter...

der code funkt ja, wie er ist..


es muss irgendwo im aufbau bezueglich des nonVCL codens liegen.........

ich werd mal temporaer das GUI app veweneden, damit ich halt wenigstens die funktionen des servers fertig machen kann, bzw noch das protocol erweitern.....

argh, solche sahcen dann bringen den ganzen zeitplan durcheinander....

scp 21. Feb 2005 23:40

Re: problem mit VCL port -> nonVCL (tcp)
 
Sleep() friert dein Programm soweit ich mich erinnere eine, also kommte es zu keinem writeln usw., eine Art Delay-Funktion wäre evtl. sinnvoller:

Delphi-Quellcode:
procedure Delay(ms : Cardinal);
Var
  TickCount : dword;
  M        : TMsg;
Begin
  TickCount := GetTickCount;
  repeat
    If PeekMessage(M, 0, 0, 0, pm_Remove) then
      Begin
        TranslateMessage(M); DispatchMessage(M);
      End;
  until not ((GetTickCount - TickCount) < ms);
End;

Beckman 21. Feb 2005 23:44

Re: problem mit VCL port -> nonVCL (tcp)
 
ja, danke...
aber repeat sleep(1) kanns net freezen, zumindest ist 1000 mal in sek schnell genug :P

egal.. folgendes:

hab jetzt ne coole VCL oberflaeche.
vil ist der auftraggeber damit einverstanden.

ich meld mich wieder, wenn net. bis dahin braucht keiner zeit verlieren mit dem code...
und danke an alle, die es haetten :)


lg, beck.

scp 21. Feb 2005 23:57

Re: problem mit VCL port -> nonVCL (tcp)
 
Ich meinte damit nicht, das dein Programm abstürzt oder so, nur das es keine Nachrichten entgegennimmt, solange es sich in der reapeat-Schleife befindet, es regagiert nicht, "schläft" eben.

Beckman 22. Feb 2005 00:04

Re: problem mit VCL port -> nonVCL (tcp)
 
jo, schon klar

aber trotzdem:

sleep(10000) wuerde erreichen, dass das prog 10sec schlaeft.

repeat
sleep(1);
until irgendwas;

allerdings behaelt es flexibel



naja egal. deine loesung ist trotzdem cooler/besser/schoener, drum will ich net meine verteidigen :P


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz