![]() |
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. |
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] |
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.... |
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; |
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. |
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.
|
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 05:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz