|
환경: C++ Builder 6.0 , QuickReport 3.0.9
보통은 조회 기능 만들어서 출력 버튼 누르면 프린터로 출력하는 식인데..
지금은, 프로그램 실행 중에 어떤 상황이 되면 바로 프린터로 결과를 출력해야 하는 상황이라,
프린팅하는 루틴을 스레드로 빼서 동시에 실행되도록 만들었습니다.
소켓으로 어떤 데이터(결과 데이터)가 들어오면 그 결과를 종이로 바로 프린트하는 것인데..
프린트하는 모듈을 스레드로 빼서 만들었고, TEvent와 같은 객체를 이용해서 프린트 스레드에
데이터 출력하라는 이벤트를 알려 줍니다.
그런데, 동일한 레포트 폼을 가지고 일반 조회 프로그램에서는 그냥 잘 출력되는데(스레드가 아닌 상황),
스레드에서 레포트폼을 만들어서 출력하면 그냥 프로그램이 lock이 걸려 버립니다.(아무 클릭도 안되는 상태)
원인이 오리무중인데.. QuickReport Help의 Print Method에 이런 내용이 있는데.. 좀 걸립니다.
For compatibility with non thread safe database drivers
this version of QuickReport doesn't create a background thread when printing a report.
QuickReport가 스레드 내에서 출력하는 것은 지원하지 않는 것인 지?
도와주세요.. 며칠 째 오리무중입니다.
* 스레드 구성 방식은 TEvent로 이벤트 동기화 해주고, 스레드는 while() 루프 안에서 TEvent 객체의
Event를 기다리다가 처리하는 방식으로, 사운드용 스레드와 디버그(16진수로 파일에 쓰는) 스레드가
정상적으로 잘 동작하고 있어서 이 스레드 구성 방식에 별 문제가 없다고 봅니다.
// 프린트 스레드의 Execute()의 로직 구성 ------------------------------------------------------------
void __fastcall TPrintThread::Execute()
{
TWaitResult Result;
unsigned char *p;
int iCnt;
ST_PrintMessage *pPrintMessage;
while ( MDIMainForm->m_bPrintThread ) {
Result = G_pPrintEvent->WaitFor(EVENT_WAIT_TIME); // Wait for 1 second;
if ( Result == wrSignaled ) { // receive the event
while ( G_pPrintQueue->Count() > 0 ) {
pPrintMessage = (ST_PrintMessage *)G_pPrintQueue->Pop();
xProcess(pPrintMessage);
delete pPrintMessage;
}
} else if ( Result == wrTimeout ) { // Time out
while ( G_pPrintQueue->Count() > 0 ) {
pPrintMessage = (ST_PrintMessage *)G_pPrintQueue->Pop();
xProcess(pPrintMessage);
delete pPrintMessage;
}
} else if ( Result == wrAbandoned ) { // Event Object was destored
} else { // wrError : An error occurred while waiting.
// Check the LastError property for an error
// code giving more information.
}
//g_Event->ResetEvent(); // Auto Event Reset Mode
}
}
// 프린터로 출력하는 메인 루틴
void __fastcall TPrintThread::xProcess(ST_PrintMessage * pPrintMessage)
{
// 중략....
if ( m_pRepExamConfirm == NULL )
m_pRepExamConfirm = new TRepExamConfirmForm(MDIMainForm);
// 중략....
m_pRepExamConfirm->RepExamConfirm->ShowProgress = true;
//m_pRepExamConfirm->RepExamConfirm->Preview();
m_pRepExamConfirm->RepExamConfirm->Print(); // lock이 걸려 버림(화면에 클릭 불가능)
// 중략
}
|