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
[37889] [질문]스레드 & DB에 저장에 관해서...
보거스 [kjlee1] 1203 읽음    2004-11-04 17:13
ADO를 사용하고 DB는 SQL2000 Server를 사용하고 있습니다.
통신은 소켓통신을 하고 있습니다. (소켓을 약 50개 정도 열었습니다.)

근데 무슨 문제로 해서 DB가 엄청 늦어졌습니다. (네트워크로 원거리에 있음.)
DB서버가 2개인데 1개 사용시 문제가 없다가 2개로 구동후 (얘기로는 1개가 죽으면 자동으로 다른 서버
구동하기 위한다는데) 문제가 생겼습니다.

전에는 프로지져로 저장할때 순간적으로 저장이 되었는데 지금은 1~2초 이상걸립니다. (1개 프로시져 저장시)
(어떤 데이타는 수신되면 프로시져 저장시 32번을 저장해야 하는데 이럴경우 거의 프로그램 죽은것 같습니다. )

그래서 임시방편으로 스레드를 사용할려고 합니다.  (NMS 프로그램 - 감시하고자 하는 대상이 약 50개 정도)
근데 스레드를 사용해도 무지하게 느립니다.  마우스를 갖다 놓으면 계속 실행하는것처럼 모래시계 모양으로
나타납니다.  종료도 관리책임자에서 종료를 시켜야 할정도로 늦습니다.

스레드는 처음 사용하는거라 힘드네요.  아무리 생각해도 방법을 모르겠네요.
몇일동안 고생하다가 도움을 청합니다.
아시는분 부탁 드리겠습니다.

아래부분은 소스의 일부분입니다.
// 통신 로직의 Class:  CPoll  의 H 파일의 아래의 스레드 클래서 입력함.

< H 파일>
class CPoll
{
    private:
    public:
        CPoll();
       ~CPoll();
        .....중간생략
};
class TSdhThread : public TThread
{
  private:
    int GaugeNum;
    void __fastcall Execute(void);
    void __fastcall UpdateThread(void);
  public :
    __fastcall TSdhThread(int TheNum);
};

< CPP 파일>
CPoll의 cpp 파일에 아래 입력 코드 입력함.
CRITICAL_SECTION CriticalSection;


// 아래는 메인폼 파일
< Create 함수 >
void __fastcall TfrmMain::FormCreate(TObject *Sender)
{
    for(int i = 0; i < 50; i++)
    {
        // DB에서 IP와 PORT를 읽어와서 Connect함
    }   
 
    Timer Enabled를 true로 설정; (Timer의 Interval은 1 ms)
    통신시작; (50 개의 대상을  폴링합니다.) // 통신로직은 따로 함수 만들어서 송,수신 합니다.

    // 스레드 생성
    InitializeCriticalSection(&CriticalSection);
    TSdhThread *T;
    T = new TSdhThread(0);
}
//-------------------------------------------------------
< Close 함수 >
void __fastcall TfrmMain::FormClose(TObject *Sender, TCloseAction &Action)
{
    DeleteCriticalSection(&CriticalSection);
}
//-------------------------------------------------------


// 아래 부분 부터는 통신로직 에서 입력했습니다.
// Class CPoll  객체명 : tpoll

__fastcall TSdhThread::TSdhThread(int TheNum): TThread(true)
{
    FreeOnTerminate = true;
    GaugeNum = TheNum;
    Resume();
}
//---------------------------------------------------------------------------
void __fastcall TSdhThread::Execute(void)
{
    while (!Terminated)
    {
        EnterCriticalSection(&CriticalSection);
        Synchronize( UpdateThread ); 
        LeaveCriticalSection(&CriticalSection);
    }
}
//---------------------------------------------------------------------------

void __fastcall TSdhThread::UpdateThread(void)
{
    // m_Msg 는 수신 데이타를 구분하는 키 입니다. (수신 데이타 종류가 여러개 입니다.)
    // tpoll은 통신 로직의 Class의 객체명 입니다.

    switch(tpoll.m_Msg)
    {
        case 1:
                    tpoll.Thread_Proc1();
                    break;
        case 2:
                    tpoll.Thread_Proc2();
                    break;
        case 3:
                    tpoll.Thread_Proc3();
                    break;
        case 4:
                    tpoll.Thread_Proc4();
                    break;
    }
}
//---------------------------------------------------------------------------

위의 호출함수의 한 함수
void CPoll::Thread_Proc1()
{
    if(n_th[sock] <= 12) // sock은 전역변수로 한 소켓의 번호.
    {
        for(int i = 0; i < 13; i++)
        {
            SAVE1(nid, i); // nid는 전역변수 입니다.
            n_th[m_trdSck]++;
        }
    }
   
    // if 부분을 빼면 계속 호출되서 저장됨.
    // 13개만 저장하고 다른것을 저장해야 하기 때문에 count 해서 처리했음.
}
//---------------------------------------------------------------------------

// 프로시져에 저장하는 함수
void CPoll::SAVE1(int nid, int id)
{
    try
    {
        adoqry->SQL->Clear();
        adoqry->SQL->Text = "프로시져명 :nid, :id";

        adoqry->Parameters->Items[0]->Value = nid;
        adoqry->Parameters->Items[1]->Value = id;

        adoqry->ExecSQL();
    }
    catch(const EOleException &E)
    {
    }
    catch (Exception &exception)
    {
    }
}
//---------------------------------------------------------------------------

DB에 문제가 없었을때는 위의 프로시져에 저장하는 함수 호출하면 즉시 저장이 되었습니다.

DB 쪽 담당자는 방법을 찾는다고 하지만 시간이 없거든요.
우선 되는걸 보여줘야 하거든요.

상세하게 쓸려고 하다보니까 너무 길어졌네요.

잘못된 부분이 어디인지 아시는분 상세하게 알려주세요.  부탁드립니다.

+ -

관련 글 리스트
37889 [질문]스레드 & DB에 저장에 관해서... 보거스 1203 2004/11/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.