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
[37796] [질문] 스레드 (CriticalSection)에 관한 질문
보거스 [] 1223 읽음    2004-10-29 10:40
스레드(CriticalSection 알고리즘으로) 를 사용하는데요 아래와 같은 Error Message가 뜨면서 실행이 안되네요.
Project TEST.exe raised exception class EOleException with message 'CoInitialize가 호출되지 않았습니다',
Process stopped. Use Step or Run to continue.
이게 무슨 말인지 잘 모르겠어요.  어떻게 해야 하는지요?
ado와 프로시저도 같이 사용됩니다.  db는 SQL 200 Server를 사용합니다.

Object Inspector에서 ado 프로퍼티를 바꿔서 하다보면 (CursorType, Filtered, ParamCheck, Prepared등)
Error 가 뜨지는 않지만 몇개는 저장이 되고 나머지는 저장이 안되요.
디버깅을 하니까 순차적으로 실행이 안되네요.
어떤경우는 프로시저를 실행하다가 중간에 빠져버리는 경우도 있고 어떤경우는 프로시저 중간부분으로
바로 들어오는 경우도 있고.. 

아시는분 도움 부탁드립니다.


참고로 제 소스를 올립니다.  (어느분이 올리신 예제 소스를 이용했습니다.)

<h 파일>
class TScreenThread : public TThread
{
  private:
    int GaugeNum;
    void __fastcall Execute(void);
    void __fastcall UpdateThread(void);
  public :
    __fastcall TScreenThread(int TheNum);
};

<cpp 파일>

CRITICAL_SECTION CriticalSection;

<중간생략>

void __fastcall TfrmMain::btnStart(TObject *Sender)
{
    TScreenThread *T;
    for (int i=0; i < 32; i++)
        T = new TScreenThread(i);
}
//---------------------------------------------------------------------------
__fastcall TScreenThread::TScreenThread(int TheNum): TThread(true)
{
    FreeOnTerminate = true;
    GaugeNum = TheNum;
    Resume();
}
//---------------------------------------------------------------------------
void __fastcall TScreenThread::Execute(void)
{
    while (!Terminated)
    {
        EnterCriticalSection(&CriticalSection);  // 이부분에서 아래로 안넘어가는 경우도 있습니다.
        UpdateThread();
        LeaveCriticalSection(&CriticalSection);
    }
}
//---------------------------------------------------------------------------
void __fastcall TScreenThread::UpdateThread(void)
{
    frmMain->Procedure_Test(frmMain->N1, frmMain->N2, frmMain->N3);
    // (N1,N2,N3 는 전역변수로 선언했음.)
}
//---------------------------------------------------------------------------

void TfrmMain::Procedure_Test(int n1, int n2, int n3)
{
    try
    {
        ado->SQL->Clear();
        ado->SQL->Add("ProcedureTest :n1, :n2, :n3");

        // Object Inspector 에서 ado 프로퍼티를 바꿔서 하면 여기까지 오다가
        // 빠져 나갈때도 있고 바로 이리로 들어오는 경우도 있구요. 

        ado->Parameters->Items[0]->Name = "n1";
        ado->Parameters->Items[1]->Name = "n2";
        ado->Parameters->Items[2]->Name = "n3";

        ado->Parameters->Items[0]->Value = n1;
        ado->Parameters->Items[1]->Value = n2;
        ado->Parameters->Items[2]->Value = n3;

        ado->ExecSQL();
    }
    catch(const EOleException &E)   
    {
        ShowMessage(E.Message);   // 이 부분을 막아도 Error Message 같음.
    }
    catch (Exception &exception)
    {
    }
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::FormCreate(TObject *Sender)
{
    InitializeCriticalSection(&CriticalSection);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormClose(TObject *Sender, TCloseAction &Action)
{
    DeleteCriticalSection(&CriticalSection);   
}
//---------------------------------------------------------------------------

+ -

관련 글 리스트
37796 [질문] 스레드 (CriticalSection)에 관한 질문 보거스 1223 2004/10/29
37818     Re:[질문] 스레드 (CriticalSection)에 관한 질문 김민식 2287 2004/11/01
37801     Re:[질문] 스레드 (CriticalSection)에 관한 질문 evergreen 1295 2004/10/29
37802         [감사] 감사합니다. 그리고 한가지만 더요. 보거스 1228 2004/10/29
37803             Re:자체 해결 (맞는건가요?) 보거스 1122 2004/10/29
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.