네.. 일단 OnRead 이벤트가 발생하면 해당 이벤트 함수가 수행이 되겠지요.. 그러면 해당 이벤트 함수의 수행이 종료가 되어야 해당함수내에서 바뀐 플래그가 반영이 되겠지요. 따라서 OnRead 이벤트 함수에서는 그냥 플래그만 바꾸어 주시는 것도 한 방법이 될 수가 있습니다.
그리고 두번째 질문하신 내용은 제가 잘못 생각을 했네요. 죄송합니다. 루프를 도는 함수가 메인쓰레드에 있다면 루프가 도는 동안 다른 이벤트는 블럭이 되겠네요. 루프를 도는 중에 플래그를 체크를 하실려면 루프함수를 보조쓰레드에서 실행을 시키셔야 할것 같습니다.
OnWrite 이벤트는 다음 해당 도움말을 참고해 보시기 바랍니다. BCB 헬프의 내용입니다.
Occurs when a client socket should write information to the socket connection.
__property TSocketNotifyEvent OnWrite = {read=FOnWrite, write=FOnWrite};
Description
Write an OnWrite to write from the socket connection. If the socket is a blocking socket, use a TWinSocketStream object to write to the connection. Otherwise, use the methods of the Socket parameter to perform the actual writing.
아울러 허접하지만 제가 예전에 쓰레드에 관해 답변해드린 내용을 링크해 봅니다.
참고가 되시길 바랍니다.
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=40312
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=40624
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=40640
참고로 저의 경우는 sub thread를 생성해서 해당 소켓의 버퍼를 계속 체크합니다. TClientSocket의 경우 BCB 도움말에도 나오지만, 소켓으로 데이터가 들어와도 이벤트가 발생하지 않는 경우가 가끔 발생하더군요. 특히 XP에서요.
해당 루틴을 첨부해 봅니다. 이것저것 삭제를 했지만 대강의 얼개는 참고가 되시리라 생각됩니다.
또 다른분들이 더 좋은 답변을 주시면 좋겠네요.. 그럼..
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "thdProc1.h"
#include "frmMain.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
__fastcall TThdProc1::TThdProc1(bool CreateSuspended)
: TThread(CreateSuspended)
{
FreeOnTerminate = true;
hThdProc = NULL;
hThdProc = CreateEvent(NULL, true, false, NULL); // 수동 리셋 이벤트
// hThdProc = CreateEvent(NULL, false, false, NULL); // 자동 리셋 이벤트
rxPacketSize = 263;
rxBufSize = 2048;
byOnePacketData = new byte [rxPacketSize];
ZeroMemory(byOnePacketData, sizeof(byOnePacketData));
}
//---------------------------------------------------------------------------
__fastcall TThdProc1::~TThdProc1()
{
CloseHandle(hThdProc);
}
//---------------------------------------------------------------------------
void __fastcall TThdProc1::Execute()
{
int i, j;
while(!Terminated)
{
ret = WaitForSingleObject(hThdProc, 500);
switch(ret)
{
case WAIT_TIMEOUT :
case WAIT_FAILED :
case WAIT_ABANDONED :
// socket이 nonblocking 일 경우 buffer에 데이터가 존재해도 이벤트를 발생하지 않는 경우 발생. 이를 방지.
if(FormMain->ClientSocket1->Socket->ReceiveLength() == 0) continue;
case WAIT_OBJECT_0 :
break;
}
int rxLen = FormMain->ClientSocket1->Socket->ReceiveLength();
if(rxLen == 0) continue;
FormMain->ClientSocket1->Socket->ReceiveBuf(chBuf, rxLen);
rxBuf.WriteBinary(chBuf, rxLen);
inDataSize = rxBuf.GetMaxReadSize();
if(inDataSize >= rxPacketSize)
{
// 데이터 처리
}//if(inDataSize >= rxPacketSize)
ResetEvent(hThdProc);
}
}
//---------------------------------------------------------------------------
김도훈 님이 쓰신 글 :
: 루프내에서 플래그를 체크 하기는 하는데요....그게 onread 가 실행 되어야 플래그 값이 변합니다.
: 그런데 루프가 완전히 끝나야 onread 가 실행이 되네요....
: 루프 중간에 onread 이벤트가 발생 하였는지 알수 잇는 방법이 있나요? 아니면 루프 중간에 onread가 실행 되도록 하는 방법 알려 주시면 감사하겠습니다....
:
: 그리고 OnWrite 이번트는 언제 일어나는 건가요? onWrite 이벤트에 대해서도 알려 주시면 감사 하겠습니다....
:
: 아 그리고 혹시 빌더에서 쓰레드 사용 법에 대한 강좌나 내용이나 팁....또는 예제등...소켓에 관한 거면 더욱 좋고 아니어도 상관 없습니다....어디에 가면 볼수 잇는지 알려 주시면 감사하겠습니다....
:
: 날씨 추운데 감기 조심하세요.....
: