1대의 Client PC에 여러개의 Thread를 돌려놓고 작업을 하고 있습니다.
문제는 ClientSocket의 ClientType을 "ctBlocking"으로 해야 한다고 하는데서
비롯됩니다(Help를 뒤저보니).
여하튼 TWinSocketStream를 이용해서 에러없이 Thread를 돌리는 데까진 성공했는데
Read가 전혀 않됩니다.
참고로 ctNonBlocking모드에서는 아주 잘 돌아 갔었습니다.
즉, ClientSocket 1개, ServerSocket 1개 일경우.
제 생각에는 TClientSocket을 Form1에 한개만 만들고 이것을 가지고
TWinSocketStream을 형성하는 것 같은데 이게 참 어렵습니다.
고수님들의 조언 부탁드립니다.
아래 제가 만든 소스를 첨부합니다. 검토 부탁드리겠습니다.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Memo2: TMemo;
Memo3: TMemo;
ClientSocket1: TClientSocket;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TMyThread = class(TThread) // Our new thread class
public
ThreadID: Integer;
ReceiveText: string;
protected
procedure Execute; override;
procedure DoUpdateMemo;
public
constructor Create(ID: Integer);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{ TMyThread }
constructor TMyThread.Create(ID: Integer);
begin
inherited Create(False);
FreeOnTerminate := True; // Automatically kill the thread when done
ThreadID := ID;
end;
procedure TMyThread.DoUpdateMemo;
begin
case ThreadID of
1: Form1.Memo1.Lines.Add(ReceiveText);
2: Form1.Memo2.Lines.Add(ReceiveText);
3: Form1.Memo3.Lines.Add(ReceiveText);
end;
end;
procedure TMyThread.Execute;
var
strQuery, strBuffer: string;
TheStream: TWinSocketStream;
ReadFromStream: array[0..511] of char;
intSent: integer;
begin
TheStream :=
TWinSocketStream.Create(Form1.ClientSocket1.Socket, 5000);
Try
with TheStream do
begin
strBuffer := 'HELLO manito' + #13#10;
Write(strBuffer, Length(strBuffer) + 1);
FillChar(ReadFromStream, 512, 0);
if WaitForData(2000) then
if Read(ReadFromStream, 512) <> 0 then
begin
ReceiveText := String(ReadFromStream);
Synchronize(DOUpdateMemo);
end;
strQuery :=
'select certnum from manitocertnum where phone ' +
' = ''123456789''';
strBuffer := IntToStr(Length(strQuery)) + #13#10;
Write(strBuffer, Length(strBuffer) + 1);
strBuffer := strQuery + #13#10;
Write(strBuffer, Length(strBuffer) + 1);
FillChar(ReadFromStream, 512, 0);
if WaitForData(2000) then
if Read(ReadFromStream, 512) <> 0 then
begin
ReceiveText := String(ReadFromStream);
Synchronize(DOUpdateMemo);
end;
strBuffer := 'BYE' + #13#10;
Write(strBuffer, Length(strBuffer) + 1);
end;
finally
TheStream.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ii: integer;
begin
for ii := 1 to 3 do
TMyThread.Create(ii);
end;
end.