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
[44221] 해결방법을 모르겠어요... 도와주세요..스레드 사용시 리치에디터에러
hann1004 [hann1004] 1514 읽음    2006-03-22 15:41
제가 지금 만들고 있는 프로그램이 멀티 스레드 프로그램인데요..
100개이상의 스레드를 한꺼번에 실행시키거든요??
근데 메인폼에 스레드의 로그를 표출하기 위해 richedit 박스를 올려놓고 스레드 생성시 또는 이벤트 발생시 richedit박스에 표출해주고 있는데...
테스트용으로 1개의 스레드를 가지고 테스트 했을 때는 전혀 문제가 없거든요??
근데 여러개를 띠웠을때는
Project COMM.exe raised exeption class EOutOfResources with message 'RichEdit Line Insertion error' 라고 발생하네요.....
표출해주는 함수에 인자가 있어서 synchronize를 사용하면 될거 같은데... 함수에 인자가 있어서 불가능할거 같구..
혹시 경험해 보신분이나 잘 알고 계신 고수분들 도움 요청드립니다.
참고로 os는 2000 인데요... 2003 서버에서 사용할거구요..
소스는 길어서 전체를 올릴수 없는데..
스레드 생성하는 부분과 로그 함수를 올립니다.
고수분들 도와 주십시요

///////////////스레드에서 다른 스레드 생성하는 부분////////////////////
    fMain->WriteLog(Global->m_WinName,"TPipeCreateThread.cpp","Execute",m_sThreadInfo+"TPipeCreateThread-이벤트 ",ELSE);

    FreeOnTerminate = true;
    //---- Place thread code here ----
    while(!Terminated){
        switch(m_nDivision){
            case SERVER_CREATE: //Write Read용으로 Instance를 2개 실행시킴.
                                //WaitForSingleObject(m_hCreateEvent,INFINITE);
                    fMain->WriteLog(Global->m_WinName,"TPipeCreateThread.cpp","Execute",m_sThreadInfo+"TPipeCreateThread-서버용 파이프",NORMAL);
                    dwReturn = WaitForMultipleObjects(2,a_hEvents,false,INFINITE);
                    dwEvent = dwReturn - WAIT_OBJECT_0;
                    if(dwEvent == 0){
                                fMain->WriteLog(Global->m_WinName,"TPipeCreateThread.cpp","Execute",m_sThreadInfo+"TPipeCreateThread-파이프 생성",ELSE);
                                a_hPipe=CreateNamedPipe(m_sPipeName.c_str(),
                                                        PIPE_ACCESS_DUPLEX,PIPE_TYPE_MESSAGE,//PIPE_TYPE_BYTE,
                                                        2,MAX_PIPE_DATA_SIZE,MAX_PIPE_DATA_SIZE,10000,NULL);
                                a_bCon=ConnectNamedPipe(a_hPipe,NULL);
                                if((a_bCon==false) && (GetLastError() == ERROR_PIPE_CONNECTED)) a_bCon=true;
                                if(a_bCon==true){
                                    Sleep(10);
                                    fMain->WriteLog(Global->m_WinName,"TPipeCreateThread.cpp","Execute",m_sThreadInfo+"TPipeCreateThread-파이프상태체크",ELSE);
                                    GetNamedPipeHandleState(a_hPipe,NULL,&(a_pPipeInfo->dwInstance),NULL,NULL,NULL,0);
                                    a_pPipeInfo->hPipe = a_hPipe;
                                    a_pPipeInfo->nDivision = SERVER_CREATE_PIPE;
                                    a_pPipeInfo->nVMS = m_nVMS;
                                    fMain->WriteLog(Global->m_WinName,"TPipeCreateThread.cpp","Execute",m_sThreadInfo+"TPipeCreateThread-포스트메시지 전송",DETAIL);
                                    PostMessage(m_hWnd,UM_PIPE_CONNECTION_SUCCESS,(WPARAM)a_hPipe,(LPARAM)a_pPipeInfo);
                                }
                                else CloseHandle(a_hPipe);
                    }
                    break;
            case CLIENT_CONNECTION:
                    fMain->WriteLog(Global->m_WinName,"TPipeCreateThread.cpp","Execute",m_sThreadInfo+"TPipeCreateThread-클라이언트용파이프",ELSE);
                                //WaitForSingleObject(m_hCreateEvent,INFINITE);
                    dwReturn = WaitForMultipleObjects(2,a_hEvents,false,INFINITE);
                    fMain->WriteLog(Global->m_WinName,"TPipeCreateThread.cpp","Execute",m_sThreadInfo+"TPipeCreateThread-파이프 생성",ELSE);
                    dwEvent = dwReturn - WAIT_OBJECT_0;
                    if(dwEvent == 0){
                                do{
                                    a_bCon=WaitNamedPipe(m_sPipeName.c_str(),10000);
                                    if(a_bCon){
                                        a_hPipe=CreateFile(m_sPipeName.c_str(),GENERIC_READ | GENERIC_WRITE,
                                                           0,NULL,OPEN_EXISTING,0,NULL);
                                        if(a_hPipe!=INVALID_HANDLE_VALUE){
                                            fMain->WriteLog(Global->m_WinName,"TPipeCreateThread.cpp","Execute",m_sThreadInfo+"TPipeCreateThread-파이프 상태체크",ELSE);
                                            GetNamedPipeHandleState(a_hPipe,NULL,&(a_pPipeInfo->dwInstance),NULL,NULL,NULL,0);
                                            a_pPipeInfo->hPipe = a_hPipe;
                                            a_pPipeInfo->nDivision = CLIENT_CONNECTION_PIPE;
                                            a_pPipeInfo->nVMS = m_nVMS;
                                            fMain->WriteLog(Global->m_WinName,"TPipeCreateThread.cpp","Execute",m_sThreadInfo+"TPipeCreateThread- 포스트메시지 전송",DETAIL);
                                            PostMessage(m_hWnd,UM_PIPE_CONNECTION_SUCCESS,(WPARAM)a_hPipe,(LPARAM)a_pPipeInfo);
                                        }
                                    }
                                    Sleep(100);
                                }while(!a_bCon);
                    }
                    break;
        }
    }


//////////////////////////////스레드 생성자///////////////////////////////////////
__fastcall TPipeReadThread::TPipeReadThread(HANDLE hPipe,
                                            int nVMS,
                                            HANDLE hWnd,
                                            HANDLE hReadEvent,
                                            int nFlag)
                                            : TThread(true)
{
    m_hPipe = hPipe;
    m_nVMS = nVMS;
    m_hWnd = hWnd;
    m_hReadEvent = hReadEvent;
    m_nFlag = nFlag;
    if(m_nFlag == VMSINTERFACE) m_sEXEName = "VMSINTERFACE";
    else m_sEXEName = "VMSCOMM";
    m_sThreadInfo = nVMS ;//+ "-" + hPipe;
    Priority = tpNormal;
    fMain->WriteLog(Global->m_WinName,"TPipeReadThread.cpp","TPipeReadThread",m_sThreadInfo+"스레드 생성완료",DETAIL);
    Resume();


}
////////////////////////////로그작성함수////////////////////////////////////////
각각의 Level에 따라서 표출색을 달리하고 Level에 따라 파일또는 화면에 호출하는 함수입니다.
위의 두부분에 서 보시면 fMain->WriteLog라고 되어있는 부분이 모두 로그를 표출하는 부분입니다.

void __fastcall TfMain::WriteLog(AnsiString sExeName, AnsiString sSource, AnsiString sFunction, AnsiString sMemo,int Level)
{
//표출로그

try{
    if(Level <= cboView->ItemIndex){
        TColor Color;
        switch(Level){
            case ALERT :    //alert --
               Color = clRed;
               break;
            case WARN :     //warn
               Color = clBlue;
               break;
            case NORMAL :   //normal
               Color = clFuchsia;
               break;
            case DETAIL :   //detail
               Color = clBlack;
               break;
        }
        String sDateTime = FormatDateTime("[YYYY/MM/DD, TT]",Now());

        sMemo = sDateTime+" "+sMemo;

        if(fMain->reLog->Lines->Count > 1000) fMain->reLog->Clear();
        fMain->reLog->SelStart = 0;
        fMain->reLog->SelAttributes->Color = Color;
        fMain->reLog->Lines->Insert(0,sMemo);
    }
}catch(...){
;
}

try{
    if(Level <= fMain->cboSave->ItemIndex){
        if(Global->m_Options.LOG.bFileLogging){
            String a_sDate = FormatDateTime("YYYYMMDD", Now());
            String a_sTime = FormatDateTime("<HH:NN:SS> ", Now());
            String a_sFileName, a_sTmp;
            TFileStream *a_FileStream;
            const WORD OPENMODE = fmOpenReadWrite | fmShareCompat | fmShareDenyNone;

            a_sFileName = LOG_PATH+sExeName;
            if (!DirectoryExists(a_sFileName))
            {
                if (!CreateDir(a_sFileName))
                    throw Exception("Cannot create \\"+sExeName);
            }

            a_sFileName += "\\"+a_sDate+".log";
            if(!FileExists(a_sFileName)) FileClose(FileCreate(a_sFileName));
            a_FileStream = new TFileStream(a_sFileName,OPENMODE);
            a_FileStream->Seek(0, soFromEnd);

            a_sTmp = a_sTime+sSource+"/"+sFunction+":"+sMemo;
            a_FileStream->Write(a_sTmp.c_str(), a_sTmp.Length());
            a_FileStream->Write("\r\n", 2);
            delete a_FileStream;
            a_FileStream = NULL;
        }
    }
}catch(...)
{
;
}
}
//---------------------------------------------------------------------------

+ -

관련 글 리스트
44221 해결방법을 모르겠어요... 도와주세요..스레드 사용시 리치에디터에러 hann1004 1514 2006/03/22
44235     Re:해결방법을 모르겠어요... 도와주세요..스레드 사용시 리치에디터에러 넘초보 1959 2006/03/23
44237         Re:Re:답변 고맙습니다. 근데요.. 하니 1261 2006/03/23
44244             Re:Re:Re:답변 고맙습니다. 근데요.. 넘초보 1479 2006/03/24
44245                 Re:Re:Re:Re:답변 고맙습니다. 꾸벅 ^^ 하니 1952 2006/03/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.