|
스레드(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);
}
//---------------------------------------------------------------------------
|