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
[45285] [질문] QuickReport를 Thread 내에서 출력할 때 Locking..
땅주인 [heaven2] 1007 읽음    2006-06-13 16:40
환경: 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이 걸려 버림(화면에 클릭 불가능)

   // 중략
}

+ -

관련 글 리스트
45285 [질문] QuickReport를 Thread 내에서 출력할 때 Locking.. 땅주인 1007 2006/06/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.