|
안녕하십니까?
프로그램을 하다보니 TClientSocket로부터 상속을 받아
이벤트를 하나 띄우고 싶은데
이벤트를 어찌띄우는지 도무지 알수가 없어서
이렇게 작업하던 소스를 올려 봅니다.
DWORD WINAPI TCSocket::ReceiveThread (void * pArg)
이 스레드 함수를 발생시켜 원하는 데이타가 들어오면
OnRecive 이벤트를 발생 시키고 싶은데 도무지 되질 않는군요..
컴화일 하고 패키지 인스톨해서 등록하고
새프로젝트 폼에서 등록시켜 돌려보면 우선 이놈이 Active = true로 줘도 Active =false가 되구요...
원하는 이벤트는 뜨지도 않는군요!!!
많은 고수님의 답변 기다릴께요....
--헤드화일
//---------------------------------------------------------------------------
#ifndef CSocketH
#define CSocketH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <ScktComp.hpp>
#define NMEAVDMVDOHEAD '!'
#define NMEADEFAULTHEAD '$'
#define NMEACR '\r'
#define NMEALF '\n'
#define AIS_DATARECEIVE WM_USER + 1
//---------------------------------------------------------------------------
class PACKAGE TCSocket : public TClientSocket
{
private:
HANDLE hReceiveThread;
public:
TNotifyEvent mOnReceive;
protected:
void __fastcall OnReceive(TMessage& msg);
public:
__fastcall TCSocket(TComponent* Owner);
//virtual void __fastcall Dispatch(void *Message);
static DWORD WINAPI ReceiveThread(void * pArg);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(AIS_DATARECEIVE, TMessage, OnReceive)
END_MESSAGE_MAP(TClientSocket)
__published:
__property TNotifyEvent OnRecv = {read = mOnReceive , write = mOnReceive };
};
//---------------------------------------------------------------------------
#endif
--CPP 화일
//---------------------------------------------------------------------------
#include <basepch.h>
#pragma hdrstop
#include "CSocket.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//
static inline void ValidCtrCheck(TCSocket *)
{
new TCSocket(NULL);
}
//---------------------------------------------------------------------------
__fastcall TCSocket::TCSocket(TComponent* Owner)
: TClientSocket(Owner)
{
DWORD dwThreadID = 0;
hReceiveThread = CreateThread(NULL, 0, ReceiveThread, this, CREATE_SUSPENDED, &dwThreadID);
if(hReceiveThread != INVALID_HANDLE_VALUE)
ResumeThread(hReceiveThread);
}
//---------------------------------------------------------------------------
void __fastcall TCSocket::OnReceive(TMessage &Msg)
{
AnsiString strAISData;
strAISData.sprintf("%s",(char *)Msg.WParam);
}
DWORD WINAPI TCSocket::ReceiveThread (void * pArg)
{
TClientSocket *S = (TClientSocket *)pArg;
char ch;
AnsiString strAISData;
AnsiString strSocketData;
AnsiString strAISReceiveData;
bool bAISDataEnable;
while(TRUE)
{
if(S->Active){
int nByte = S->Socket->ReceiveBuf((void * )&ch,1);
if(nByte == 1){
if(ch == NMEAVDMVDOHEAD){
strSocketData.sprintf("%c",ch);
bAISDataEnable = true;
}
else if(bAISDataEnable){
if(ch == NMEALF){
strSocketData += AnsiString(ch);
strAISReceiveData = strSocketData;
bAISDataEnable = false;
TMessage msg;
SendMessage(S->Socket->Handle,
AIS_DATARECEIVE,
(WPARAM)strAISReceiveData.c_str(),
(LPARAM)S->Socket->Handle
);
}
}
}
}
}
return 1L;
}
namespace Csocket
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TCSocket)};
RegisterComponents("WoosSocket", classes, 0);
}
}
//---------------------------------------------------------------------------
|