Q&A
HOME
Tips & Tech
Q&A
Discuss
Download
자유게시판
홍보 / 광고
구인 / 구직
LOGIN
회원가입
Indy를 이용해서 소켓프로그램을 만들었는데...
client에서 server로 query문장을 날리면 server가 받은 query를 실행해서
자료를 화일로 만들게
1
COMMENTS
구창민
•
2001.07.25 06:15
안녕하세요~ 구창민입니다.
Indy에서는 fork 를 지원하지 않습니다.
대신 거의 유사하게 동작하는 쓰레드를 지원합니다.
아래 답변은 일전에 권용길님이 답변하신 내용인데, 님의
질문과 일맥하는 내용인거 같아 올려드립니다.
보시고, 항상 즐거운 프로그래밍 하시길~
===============================================================
[첫번째 방법]
OnExecute에서 테이블을 생성하고 소멸시켜 각 쓰레드마다
다른 테이블 컴포넌트를 사용하게 하면 됩니다.
단점은 테이블 생성, 내부적인 DB연결, 소멸로 인한 오버헤드입니다.
장점은 각 DB Query가 여러쓰레드에 의해서 동시에 실행되므로
병렬성이 좋아진다는 거지요.
[두번째 방법]
인디의 OnExecute는 개별 쓰레드 상에서 실행되는 건 아시죠?
델파이의 Thread에는 메소드 호출을 동기화해서 특정 메소드가
여러 쓰레드에 의해 동시해 호출되는 일을 없도록 해주는 메소드가
있습니다. 이 놈이 Syncronize인데 이놈의 인자로 동기화 시킬 필요가
있는 즉, 한 번에 한 개의 쓰레드만 실행시키고 싶은 메소드를 전달합니다.
이것은 메소드를 메인쓰레드에서 실행하기 때문에 가능한 일입니다.
예제를 만들어 드리고 싶지만, 바빠서 말로 대신 합니다.
아래는 테스트하지 않은 예제이므로 오타, 버그 등이 숨어 있을 수 있음다.
var
TForm1 = class(TForm)
...
FUserInfo : TUserInfo ; // 사용자 정보 저장소, 구조체로 직접 정의하세요.
procedure UpdateUsernfo;
...
end;
// 이 메소드는 Syncronize에 의해 호출되므로
// 한 번에 한 개의 쓰레드에 의해 실행된다.
procedure TForn1.UpdateUserInfo;
begin
// FUserInfo 데이터를 읽어 필요한 작업을 한다.
// 사용자를 찾고 IP를 변경하는 등...
end;
procedure TForn1.IdTCPServer1OnExecute( AThread : TIdThread );
begin
// FUserInfo에 필요한 데이터를 써 넣는다.
AThread.Syncronize( UpdateUserInfo );
end;
여기서 유의할 점은....
Syncronize의 인자로 오는 함수는 그 자체가 인자가 없는 프로시저이기
때문에 인자로 자료를 전달할 수 없습니다.
따라서, 위 처럼 멤버 필드를 하나 만들어 자료를 전달합니다.
이런 모습을 쓰레드끼리 서로 데이터를 통해 연동한다고해서
'데이터 바인딩'이라고 합니다.
또한 OnExecute는 우리 보통 생각과는 달리 Connection이 유지되고 있는 한
계속해서 반복적으로 호출됩니다. 따라서, OnExecute 함수에서
단번에 모든 처리를 다했다면 리턴하기 전에
AThread.Connectino.Disconnected를 호출하는 것이 올바릅니다.
[보너스! 아래 방법이 않 통한 이유]
크리티컬 섹션도 한 방법입니다만,
여기서 제대로 작동하지 않은 이유는...
크릭티컬 섹션이 항상 생성 되어 있어야 하는데,
쓰레드가 서로 생성했다가 지우기 때문입니다.
InitializeCriticalSection를 Initialization 파트에
DeleteCriticalSection을 finalization 파트에 두면 잘 될 겁니다.
[정리]
마지막 두 방법은 DB 질의가 동시에 수행되지 않기 때문에
쓰레드의 장점을 살리지 못할 수 있습니다.
따라서, 직렬화(혹은 크리티컬 섹션)가 필요한 부분을 최소화하여
병렬 실행의 장점을 살리는 것이 좋습니다.
방법1을 사용하더라도 Query를 Query Pool 같은 곳에 미리 여러개 생성해놓고
재사용 한다면 간단하면서도 좋은 성능을 낼 수 있습니다.
이상이 제가 드릴 수 있는 거의 모든 정보입니다.
김초보 wrote:
> client에서 server로 query문장을 날리면 server가 받은 query를 실행해서
> 자료를 화일로 만들게
0
0
삭제
수정
댓글
(NOTICE) You must be
logged in
to comment on this post.
김재형
2001.07.25 07:19
0
COMMENTS
/
0
LIKES
ado에관해서 입니다....
김재형
2001.07.25 07:20
0
COMMENTS
/
0
LIKES
고수님들에게 질문이있읍니다.fm20.dll에관해
써비
•
2001.07.25 07:04
1
COMMENTS
/
0
LIKES
StringGrid의 cell에 숫자입력할때 포맷지정하는 방법?
홍성락
•
2001.07.25 19:32
써비 wrote: > 안녕하세요 > > StringGrid에서 숫자를 입력하는데 콤마나 소숫점등의 포맷을 표현하고 ...
델초보자
•
2001.07.25 06:17
2
COMMENTS
/
0
LIKES
ADO QUERY CLOSE시 error
구창민
•
2001.07.25 06:35
^_^ 제 옆에 영대씨가 와서 팻치 하면 된다고 하네요.. 항상 즐거운 프로그래밍 하시길~~ 델...
델초보자
•
2001.07.25 09:36
.
초보델피
•
2001.07.25 06:00
1
COMMENTS
/
0
LIKES
델파이로 멜 내는 프로그램중에서 본문에 태그를 먹게하고 싶은데여?
구창민
•
2001.07.25 06:37
우선 태그가 삽입된 메일을 보내시면 받는 측에서 그 메일을 보여줄때 HTML을 지원한다면 볼수 있구요. ...
초보
2001.07.25 05:53
0
COMMENTS
/
0
LIKES
릴리즈 버전은 어떻게 만들죠?
최초보
2001.07.25 05:47
0
COMMENTS
/
0
LIKES
DLL에서 값리턴 질문!!!
김초보
•
2001.07.25 04:57
1
COMMENTS
/
0
LIKES
Indy를 이용해서 소켓프로그램을 만들었는데...
client에서 server로 query문장을 날리면 server가 받은 query를 실행해서 자료를 화일로 만들게
구창민
•
2001.07.25 06:15
안녕하세요~ 구창민입니다. Indy에서는 fork 를 지원하지 않습니다. 대신 거의 유사하게 동작하는 쓰...
델초보
•
2001.07.25 04:31
1
COMMENTS
/
0
LIKES
if .. in... 있잖아요...
구창민
•
2001.07.25 06:27
안녕하세요~ 구창민입니다. if ..in.. 에서 in에는 스트링을 사용하실 수 없습니다. 즉, 한바이트 단...
freelab
2001.07.25 04:26
0
COMMENTS
/
0
LIKES
Indy컴포넌트를 사용하여 ISAPI에서 파일첨부시 문제가.
kittysp
2001.07.25 04:16
0
COMMENTS
/
0
LIKES
URL에 해당하는 페이지를 축소해서 보여줄 수 있는지...
미쳐가요!
2001.07.25 04:10
0
COMMENTS
/
0
LIKES
다중상속 편법이 없을까요?
이호림
•
2001.07.25 03:53
1
COMMENTS
/
0
LIKES
컴포넌트를 선택할려면 어떻게 해야 하나요?
홍성락
•
2001.07.25 05:07
이호림 wrote: > 안녕하세요. 이호림이라고 합니다. > 델파이에서 특정 컴포넌트를 선택해서 Form위를 클...
제발..
2001.07.25 03:17
0
COMMENTS
/
0
LIKES
컴포넌트 제작 .. 제발 도와주세요..
김현
•
2001.07.25 03:09
1
COMMENTS
/
0
LIKES
엑셀관련... 알려주세요..
소
•
2001.07.26 00:47
Delphi3.0, Excel2000에서 테스트 해보니 잘 되는데요? 엑셀파일을 읽기전용으로 해도 잘 되내요? ----...
송인규
•
2001.07.25 02:44
3
COMMENTS
/
0
LIKES
DEL*.MB에러 좀 잡아주세요
구창민
•
2001.07.25 06:34
송인규 wrote: > DB에 I/O 작업을 하던중 에러가 발생하여 종료하면 해당 디렉토리에 DEL1.MB, DEL2.MB......
송인규
•
2001.07.25 18:06
답변 고맙습니다. 근본적으로 생겨나지 않게 하는 방법은 없습니까? 작업 담당자는 컴맹이라 어떻게 ...
구창민
•
2001.07.25 20:21
그런 오류는 들어본적이 없어서.. ㅡㅡ; 패러독스 파일 확장자(db, px, val...)의 의미 - from USING...
aparadin
2001.07.25 02:20
0
COMMENTS
/
0
LIKES
DB질문)Locate 버그? 좀 봐주십시오
irookie
•
2001.07.25 02:15
1
COMMENTS
/
0
LIKES
select into...
irookie
•
2001.07.25 02:18
오라클을 너무 오래 사용했다 봅니다. 쩝 --; select money as tmpMoney from "price.db"; 파라독스...
미르짱
•
2001.07.25 02:07
4
COMMENTS
/
0
LIKES
dbgrid의 select색깔 바꾸기
홍성락
•
2001.07.25 06:31
미르짱 wrote: > 고수님들의 도움을 요청합니다...... > dbgrid의 옵션에서 dgRowselect를 True로 하면 ...
미르짱
•
2001.07.25 20:05
홍성락님의 성의있는 답변에 먼저 감사드립니닫.. 그런데 님께서 올린 소스데로 해보았는데 색깔에 변화가...
홍성락
•
2001.07.25 20:44
제것은 되는데요 dbgrid의 옵션에서 dgRowselect를 True로 하고, 필요시 dgMultiSelect도 True로하고요. ...
홍성락
•
2001.07.25 05:33
미르짱 wrote: > 고수님들의 도움을 요청합니다...... > dbgrid의 옵션에서 dgRowselect를 True로 하면 ...
초짜...
•
2001.07.25 02:01
2
COMMENTS
/
0
LIKES
Form이 아닌 PaintBox위에 TMemo를 동적으로 만들구 싶어요...
홍성락
•
2001.07.25 02:27
PaintBox는 windowed controls류가 아니므로 다른 객체를 Parent로써 갖지 못합니다. 객체의 hierarchy를 ...
초짜...
•
2001.07.25 03:18
답변 감사합니다.. 물론 그런 방법도 있겠지만... 지금 그렇게 쓸수 없는 이유는 그리기 오브젝트(선,박...
김초보
2001/07/25 04:57
Views
206
Likes
0
Comments
1
Reports
0
Tag List
수정
삭제
목록으로
한델 로그인 하기
로그인 상태 유지
아직 회원이 아니세요? 가입하세요!
암호를 잊어버리셨나요?
Indy에서는 fork 를 지원하지 않습니다.
대신 거의 유사하게 동작하는 쓰레드를 지원합니다.
아래 답변은 일전에 권용길님이 답변하신 내용인데, 님의
질문과 일맥하는 내용인거 같아 올려드립니다.
보시고, 항상 즐거운 프로그래밍 하시길~
===============================================================
[첫번째 방법]
OnExecute에서 테이블을 생성하고 소멸시켜 각 쓰레드마다
다른 테이블 컴포넌트를 사용하게 하면 됩니다.
단점은 테이블 생성, 내부적인 DB연결, 소멸로 인한 오버헤드입니다.
장점은 각 DB Query가 여러쓰레드에 의해서 동시에 실행되므로
병렬성이 좋아진다는 거지요.
[두번째 방법]
인디의 OnExecute는 개별 쓰레드 상에서 실행되는 건 아시죠?
델파이의 Thread에는 메소드 호출을 동기화해서 특정 메소드가
여러 쓰레드에 의해 동시해 호출되는 일을 없도록 해주는 메소드가
있습니다. 이 놈이 Syncronize인데 이놈의 인자로 동기화 시킬 필요가
있는 즉, 한 번에 한 개의 쓰레드만 실행시키고 싶은 메소드를 전달합니다.
이것은 메소드를 메인쓰레드에서 실행하기 때문에 가능한 일입니다.
예제를 만들어 드리고 싶지만, 바빠서 말로 대신 합니다.
아래는 테스트하지 않은 예제이므로 오타, 버그 등이 숨어 있을 수 있음다.
var
TForm1 = class(TForm)
...
FUserInfo : TUserInfo ; // 사용자 정보 저장소, 구조체로 직접 정의하세요.
procedure UpdateUsernfo;
...
end;
// 이 메소드는 Syncronize에 의해 호출되므로
// 한 번에 한 개의 쓰레드에 의해 실행된다.
procedure TForn1.UpdateUserInfo;
begin
// FUserInfo 데이터를 읽어 필요한 작업을 한다.
// 사용자를 찾고 IP를 변경하는 등...
end;
procedure TForn1.IdTCPServer1OnExecute( AThread : TIdThread );
begin
// FUserInfo에 필요한 데이터를 써 넣는다.
AThread.Syncronize( UpdateUserInfo );
end;
여기서 유의할 점은....
Syncronize의 인자로 오는 함수는 그 자체가 인자가 없는 프로시저이기
때문에 인자로 자료를 전달할 수 없습니다.
따라서, 위 처럼 멤버 필드를 하나 만들어 자료를 전달합니다.
이런 모습을 쓰레드끼리 서로 데이터를 통해 연동한다고해서
'데이터 바인딩'이라고 합니다.
또한 OnExecute는 우리 보통 생각과는 달리 Connection이 유지되고 있는 한
계속해서 반복적으로 호출됩니다. 따라서, OnExecute 함수에서
단번에 모든 처리를 다했다면 리턴하기 전에
AThread.Connectino.Disconnected를 호출하는 것이 올바릅니다.
[보너스! 아래 방법이 않 통한 이유]
크리티컬 섹션도 한 방법입니다만,
여기서 제대로 작동하지 않은 이유는...
크릭티컬 섹션이 항상 생성 되어 있어야 하는데,
쓰레드가 서로 생성했다가 지우기 때문입니다.
InitializeCriticalSection를 Initialization 파트에
DeleteCriticalSection을 finalization 파트에 두면 잘 될 겁니다.
[정리]
마지막 두 방법은 DB 질의가 동시에 수행되지 않기 때문에
쓰레드의 장점을 살리지 못할 수 있습니다.
따라서, 직렬화(혹은 크리티컬 섹션)가 필요한 부분을 최소화하여
병렬 실행의 장점을 살리는 것이 좋습니다.
방법1을 사용하더라도 Query를 Query Pool 같은 곳에 미리 여러개 생성해놓고
재사용 한다면 간단하면서도 좋은 성능을 낼 수 있습니다.
이상이 제가 드릴 수 있는 거의 모든 정보입니다.
김초보 wrote:
> client에서 server로 query문장을 날리면 server가 받은 query를 실행해서
> 자료를 화일로 만들게