안녕하세요.
지금 장비와 TCP/IP 통신을 사용하여 데이터를 받는 프로그램을 개발하고 있습니다.
컴포넌트는 IndyClient를 사용하구 있구요..
그런데 아래 첨부한 코드를 사용해서 'SEND' 버튼을 이용하여 명령어를 보내면 한번은 Client 소켓에 쓰는데 한번은 소켓에 쓰지 못해 데이터를 받을 수 없습니다.
(TClientHandleThread.Execute 루틴은 두번 중 한번밖에 들어오지 않음)
예전엔 이런 방법으로 데이터를 받았던거 같은데.. 뭐가 문젠지 모르겠습니다.
빠른 답변 부탁드립니다.
감사합니다.
unit MainForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient;
const
CRLF = #13#10;
type
TClientHandleThread = class(TThread)
private
FMsg : string;
procedure HandleInput;
protected
procedure Execute;override;
public
end;
type
TFormMain = class(TForm)
Panel1: TPanel;
Button1: TButton;
LEdit_IP: TLabeledEdit;
LEdit_Port: TLabeledEdit;
Button2: TButton;
Edit_CMD: TEdit;
Button3: TButton;
IdTCPClient: TIdTCPClient;
Memo: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure IdTCPClientConnected(Sender: TObject);
procedure IdTCPClientDisconnected(Sender: TObject);
private
{ Private declarations }
public
FClientThread : TClientHandleThread;
FCurrCMD : string;
{ Public declarations }
end;
var
FormMain: TFormMain;
implementation
{$R *.dfm}
//=================================================================
// Thread 부분
//=================================================================
procedure TClientHandleThread.Execute;
begin
try
while not Terminated do
begin
FMsg := FormMain.IdTCPClient.ReadLn;
Synchronize(HandleInput);
end;
except
Terminate;
end;
end;
procedure TClientHandleThread.HandleInput;
begin
FormMain.Memo.Lines.Add(FMsg)
end;
//=================================================================
// Form Main
//=================================================================
procedure TFormMain.Button1Click(Sender: TObject);
begin
Close;
end;
// 'SEND' 버튼
procedure TFormMain.Button3Click(Sender: TObject);
begin
FCurrCMD := Trim(Edit_CMD.Text) + CRLF;
IdTCPClient.WriteLn(FCurrCMD); //클라이언트 소켓에 쓰기...
end;
procedure TFormMain.Button2Click(Sender: TObject);
begin
if IdTCPClient.Connected then
begin
IdTCPClient.Disconnect;
end
else
begin
IdTCPClient.Host := Trim(LEdit_IP.Text);
IdTCPClient.Port := StrToInt(Trim(LEdit_Port.Text));
IdTCPClient.Connect(10000);
end;
end;
procedure TFormMain.IdTCPClientConnected(Sender: TObject);
begin
FClientThread := TClientHandleThread.Create(True);
FClientThread.FreeOnTerminate:=True;
FClientThread.Resume;
Button2.Caption := '연결해제';
end;
procedure TFormMain.IdTCPClientDisconnected(Sender: TObject);
begin
if Assigned(FClientThread) then FClientThread.Terminate;
Button2.Caption := '연결';
end;
end.