C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[56781] 쓰레드 관련 질문입니다!!!
김달식 [] 1483 읽음    2009-05-05 01:55
안녕하세요!! 부산촌님입니다.

쓰레드로 프로그램 하고 있는데 도저히 풀리지 않는군요!!
어디가 문제인지도 모르겠구요!!

쓰레드 헤드를 아래와 같이 정의 했읍니다

class TThreadAIS123 : public TThread
{
  typedef struct tagTHREADNAME_INFO
  {
    DWORD dwType;     // must be 0x1000
    LPCSTR szName;    // pointer to name (in user addr space)
    DWORD dwThreadID; // thread ID (-1=caller thread)
    DWORD dwFlags;    // reserved for future use, must be zero
  } THREADNAME_INFO;

private:
    TADOQuery   *Qry;
    AnsiString  MMSI;
    strMSG1     MSG1;
    AnsiString  SqlTxt;
    int         ShipUpDateCount;
    void        SetName();
protected:
    void __fastcall Execute();
    void __fastcall UpdateCaption();
public:
    __fastcall TThreadAIS123(bool CreateSuspended,AnsiString mmsi,void * msg,int ShipCount,AnsiString Txt);
    __fastcall virtual ~TThreadAIS123(void){threadcnt--;};

    AnsiString  __fastcall MakeSqlMessage123(void);
    AnsiString  __fastcall MakeSqlMessage5Update(void);
    AnsiString  __fastcall MakeSqlMessage5Insert(void);
    int         __fastcall SqlMsg5H(AnsiString MMSI);
};
//---------------------------------------------------------------------------

글구 스레드 본체를 다음과 같이 정의 하고
__fastcall TThreadAIS123::TThreadAIS123(bool CreateSuspended,AnsiString mmsi,void *msg,int ShipCount,AnsiString Txt)
    : TThread(CreateSuspended)
{
    FreeOnTerminate = true;
    ShipUpDateCount = ShipCount;
    MMSI = mmsi;
    memcpy((void *)&MSG1,msg,sizeof(strMSG1));
    SqlTxt = Txt;
    threadcnt++;
}



//---------------------------------------------------------------------------
void TThreadAIS123::SetName()
{
    THREADNAME_INFO info;
    info.dwType = 0x1000;
    info.szName = "TThreadAIS123";
    info.dwThreadID = -1;
    info.dwFlags = 0;

    __try
    {
         RaiseException( 0x406D1388, 0, sizeof(info)/sizeof(DWORD),(DWORD*)&info );
    }
    __except (EXCEPTION_CONTINUE_EXECUTION)
    {
    }
}
//---------------------------------------------------------------------------
void __fastcall TThreadAIS123::UpdateCaption()
{
}
void __fastcall TThreadAIS123::Execute()
{
    //SetName();
    CoInitialize(NULL);
    if(Qry==NULL){
        Qry = new TADOQuery(NULL);
        Qry->Connection = DB_Con;
    }
    try{
        Qry->SQL->Text = SqlTxt;
        Qry->ExecSQL();                         //Table에 데이터 저장
    }catch(...){
        Qry->Free();
        return;
    }

    //메시지 5H에 저장
    try{
        if(SqlMsg5H(MMSI)==1){
            Qry->SQL->Text = MakeSqlMessage5Update();
        }else{
            Qry->SQL->Text = MakeSqlMessage5Insert();
        }
        Qry->ExecSQL();                         //5H Table에 데이터 저장
    }catch(...){
        Qry->Free();
        return;
    }
    Qry->Free();
    //this->Terminate();
    //CoUninitialize();
}

쓰레드 콜은 아래와 같읍니다.
if(CurruntMessageID == 1 || CurruntMessageID == 2 || CurruntMessageID == 3){
        if(threadcnt<3){
            TThreadAIS123 *AIS123 = new TThreadAIS123(false,MSG1.UserID,(void *)&MSG1,1,MakeSqlMessage123());
            AIS123->Priority = tpTimeCritical;
            AIS123->Resume();
        }
        return;
    }

그렁데 이쓰레드 끝이 나질 안구요          Qry->SQL->Text = SqlTxt; 이부분에서
" 개체가 열려있으면 작업이 허용되지 않습니다 " 라는 에러가 뜨는군요!!!
도저히 알수가없어 도움을 요청합니다..

+ -

관련 글 리스트
56781 쓰레드 관련 질문입니다!!! 김달식 1483 2009/05/05
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.