Q&A

  • 1PC에 여러개의 ClientSocket을 Thread로 돌리려면
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.



0  COMMENTS
    • 워니99
    • 2000.07.21 07:46
    • 0 COMMENTS
    • /
    • 0 LIKES
    • kay
    • 2000.07.21 07:09
    • 0 COMMENTS
    • /
    • 0 LIKES
    • hugehead
    • 2000.07.21 07:06
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 김희중
      2000.07.25 19:24
      DBEdit 속성중 ReadOnly를 True로 설정하시면 됩니다. hugehead wrote: > 도와주세요... > DBEdit에 ...
    • Mr.Q
      2000.07.21 10:19
      에디트 enabled:=false하세요. 리드온리에도 포커스가 먹히고, 화면상으로 입력상태가 보이지만, 결과물...
    • 허춘
      2000.07.21 08:59
      hugehead wrote: > 도와주세요... > DBEdit에 있는 값은 보여주고, 다른 곳에서 수정을 해야 하는데, 사...
    • hugehead
      2000.07.22 02:01
      DBEdit.enabled False가 되면 안됩니다. 그래서 문제이지요. DBEdit.Enabled가 False이면 database와 ...
    • 수연이
    • 2000.07.21 07:05
    • 1 COMMENTS
    • /
    • 0 LIKES
    • Black}{ole
      2000.07.21 07:34
      수연이 wrote: > 프로그램을 실행할 때 변수를 받아야 하는데 어떻게 해야 하나요? > > 예를 들어 > ...
    • 윤수경
    • 2000.07.21 06:42
    • 2 COMMENTS
    • /
    • 0 LIKES
    • Mr.Q
      2000.07.21 12:18
      윤수경 wrote: > "datetostr(date)"를 하면 시스템의 날짜를 "YYYY-MM-DD" 형식으러 보여 줍니다... > ...
    • 조규춘
      2000.07.21 06:57
      윤수경 wrote: > "datetostr(date)"를 하면 시스템의 날짜를 "YYYY-MM-DD" 형식으러 보여 줍니다... > ...
    • Mr.Q
      2000.07.21 10:48
      서봉석 wrote: > dbgrid 에서 특정셀 의 색깔바꾸기를 자칭 고수라는 > > 사람에게 물어 봤지만 안된다...
    • 조규춘
      2000.07.21 06:41
      서봉석 wrote: > dbgrid 에서 특정셀 의 색깔바꾸기를 자칭 고수라는 > > 사람에게 물어 봤지만 안된다...
    • 서봉석
      2000.07.21 07:41
      답변에 주셔서 감사합니다.... 아래와 같이 코딩 한 것은 이미 여기서 소스를 보고 했거든요... 그런데.....
    • Mr.Q
      2000.07.21 13:47
      서봉석 wrote: > 답변에 주셔서 감사합니다.... > 아래와 같이 코딩 한 것은 이미 여기서 소스를 보고 했...
    • 조규춘
      2000.07.21 09:11
      서봉석 wrote: > 답변에 주셔서 감사합니다.... > 아래와 같이 코딩 한 것은 이미 여기서 소스를 보고 했...
    • Black}{ole
      2000.07.21 06:21
      서봉석 wrote: > dbgrid 에서 특정셀 의 색깔바꾸기를 자칭 고수라는 > > 사람에게 물어 봤지만 안된다...
    • 김병훈
    • 2000.07.21 04:27
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.07.21 19:02
      안녕하세요. 최용일입니다. 함수 원형은 Interface절에 기술하고 코드는 Implementation절에 기술하세요...
    • 2000.07.21 04:10
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.07.21 19:04
      안녕하세요. 최용일입니다. DelphiX_for5란 패키지가 설치안된것 같습니다. DelphiX_for5란 패키지를 설...
    • djha
    • 2000.07.21 04:08
    • 1 COMMENTS
    • /
    • 0 LIKES
    • Black}{ole
      2000.07.21 04:29
      djha wrote: > > 어디선가 같은 질문내용을 본적이 있는것 > 같은데 찾아지지가 않는군요. > > List...
    • Mr.Q
      2000.07.21 10:51
      강성훈 wrote: > 예를 들어 디렉토리 리스트박스에서 현재의 경로가 > "C:tempkkk" > 에 있다고 가정할...
    • 조규춘
      2000.07.21 04:08
      강성훈 wrote: > 예를 들어 디렉토리 리스트박스에서 현재의 경로가 > "C:tempkkk" > 에 있다고 가정할...
    • 강성훈
      2000.07.21 20:00
      감사합니다
    • 김태영
    • 2000.07.21 03:25
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 이주흥
      2000.07.21 03:31
    • 김태영
      2000.07.21 03:43
    • 조규춘
      2000.07.21 03:51
    • 김태영
      2000.07.21 04:00
    • 조규춘
      2000.07.21 04:04
    • 어린왕자
      2000.07.21 03:52
      4master wrote: > Access랑 dBase를 ADO를 사용하여서 연결하였습니다. > 근데... ADOConnection에서... ...
    • 신승욱
    • 2000.07.21 03:22
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 배우미
      2000.07.22 17:44
      신승욱 wrote: > 가내두루 평안하오신지요..???? > 갑자기 어려운 문제에 부닥쳐 이렇게 질문올립니다.. ...
    • 김선달
    • 2000.07.21 03:11
    • 1 COMMENTS
    • /
    • 0 LIKES
    • Black}{ole
      2000.07.21 05:04
      김선달 wrote: > ScreenToClient메소드 와 ClientToScreen 에 대한 자세한 설명을 좀 해주세요 > 감사합...
    • 김영해
      2000.07.21 03:00
      주현이 wrote: > 퀵리포트의 qrband나 qrstringband에서 세로구분선을 그리거나 만드는 방법이 있나요.. ...
    • 주현이
      2000.07.21 03:02
      ^^;
    • heimdal
    • 2000.07.21 02:33
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 허춘
      2000.07.21 08:55
      heimdal wrote: > 안녕하세여.. > 며칠전에 검색으루 질문을 드렸던 헴달입니다.. > 근데 정말 엄청나게...
    • heimdal
      2000.07.28 02:43
      허춘 wrote: > heimdal wrote: > > 안녕하세여.. > > 며칠전에 검색으루 질문을 드렸던 헴달입니다.. >...
    • parkisu
      2000.07.21 10:11
      완전 초보 wrote: > 저는 완전 초보입니다. > save를 눌르거나 saveas를 눌렸을때 > saveDialog가 뜨고 ...