|
UpdateThread();를 Synchronize( UpdateThread );로 바꿔서 실행해 본 후 실행해 보세요(장담 못함 -_-;;)
혹시 잘 되더라고 결과 알려 주세요. 갠적으로 궁금하거든요 ^^
행복하세요
초보자 님이 쓰신 글 :
: 스레드(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);
: }
: //---------------------------------------------------------------------------
|