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
[41962] Re:Re:Re:Re:[감사] 답변 감사합니다.
초보 [] 1702 읽음    2005-09-21 12:24
말씀하신 내용이
CRITICAL_SECTION    CriticalSection;  1개만 선언해서
아래처럼 다른 쓰레드에서 임계영역을 같이 사용하라는거 맞는지요?

// 1번째 쓰레드
__fastcall TThread1::TThread1(int nNum): TThread(true)
{
    FreeOnTerminate = true;
}
void __fastcall TThread1::Execute()
{
    while(!Terminated)
    {
        EnterCriticalSection(&CriticalSection);
        Sleep(10);
        SAVE_1();
        LeaveCriticalSection(&CriticalSection);
        Terminate();
        break;
    }
}
//---------------------------------------------------------------------------

// 2번째 쓰레드
__fastcall TThread2::TThread2(int nNum): TThread(true)
{
    FreeOnTerminate = true;
}
void __fastcall TThread2::Execute()
{
    while(!Terminated)
    {
        EnterCriticalSection(&CriticalSection);
        Sleep(10);
        SAVE_2();
        LeaveCriticalSection(&CriticalSection);
        Terminate();
        break;
    }
}
//---------------------------------------------------------------------------


DB는 원격으로 저장하구요.  DB쪽은 다른회사에서 작업을 한것이라 뭐라고 개입하기는 힘들지만
시험결과 어떤 프로시져는 1개의 데이타(200 byte정도)만 저장해도 몇초(2~3초)가 걸리는것이 있고
어떤 프로시져는 수십 ms 정도도 안되는것처럼 빠르게 저장됩니다.

30초 정도 간격으로 데이타가 오는데 60개 장비에서 수신데이타가 한번에 몰리게 되면 
한 장비당 2~3개 데이타가 들어오니까
200 * 3 * 60 byte (36000 byte가 한번에 몰렸을때 로드가 걸리지 않나요?)
제생각에도 크게 로드가 걸리지 않을거 같은데 몇개의 늦게 저장되는 프로시져 때문에 스레드를 사용하려고 합니다

일반적인 데이타는 스레드 사용하지 않구  몇개(3개 정도)는 스레드를 사용해야 될것 같아서 질문을 올리게
됐습니다.

먼저 말씀하신데로 adoquery와 ADOConnection과 1쌍으로 설정해서 시험해보니까 에러는 뜨지 않네요.
단지 늦게 저장되는 프로시져 부분때문에 CPU 점유율이 높네요. 
(sqlservr.exe 프로세스 cpu 점유율이 90% 이상 나와요. - 제생각에 계속 DB에 밀어넣는데 DB에서
처리를 못하는거 같은데 맞는지 모르겠어요.)

수신부분과 저장부분을 나누어도 늦게 저장되는 프로시져때문에 계속 잡고 있을거 같습니다.

현재는 제 PC에 SQL 2000 Server 설치해서 로컬로 테스트 하고 있습니다.

SQL 2000 Server 를 많이 사용해본 친구한테 얘기하니까  수백 byte 짜리 데이타 저장하는데 몇초걸린다는건
말도 안된다고 하네요.  제가 시뮬레이터 프로그램 만들어서 시험해본 결과 정말로 몇초가 걸렸습니다.
DB쪽 맡은 회사쪽에  말은 했는데 수정이 될지 모르겠네요.


너무 길게 썼네요.
답변 감사드리구요.






smleelms 님이 쓰신 글 :
: 하나의 CriticalSection을 2개의 thread에서 동기화를 시킨다는 내용은 CriticalSection을 하나만 선언하신 후, 이 CriticalSection을 각각의 thread에서 호출해 사용하시라는 겁니다. 즉 하나의 임계영역만 선언하셔야 각각의 thread에서 이를 인지하고 임계영역을 보호할 수 있겠지요.
:
: 이전 예제처럼 2개의 임계영역을 설정하신 후에 각각의 쓰레드에서 각각의 임계영역을 액세스하게되면, 선언은 2개의 임계영역이지만, 결국은 하나의 리소스, 즉 하나의 ADOConnection에 다수의 쿼리가 요구를 하게 되니까요...
:
: 이부분이 결국 "Project TEST.EXE raised exception class EOleException -- '다른 명령 결과 때문에 연결을 사용중입니다.', ---" 라는 에러를 발생시킨걸로 보입니다.
:
: 그러면 결국 하나의 CriticalSection을 선언하신 후, 60여개의 장비에서 올라오는 데이터를 핸들링해야 된다는 내용이 될것 같은데.. 이러면 이전에 설계내지는 코딩하신 방식을 보면 쓰레드가 60여개 또는 이번에 질문하신대로 10여개 이상이 되는데.. (쓰레드 또는 CriticalSection 질문하신 내용을 보면..)
:
: 실제 60여개의 장비에서 30초 정도의 간격으로 올라오는 데이터라면... (각각의 장비가 30초인지 전체장비가 30초인지는 잘 모르겠으나.. ^^;) 크게 많은 로드가 걸릴걸로 보이지는 않습니다만...
: 그러나 DB 서버가 원격인지, 로컬인지 등등 여러가지 유동적인 상황이 있을 수 있습니다. 이런부분은 해당 개발자가 아니니 정확히 짚어드리기는 힘들것 같습니다.
:
: 일단 제가 추천드리고 싶은 방법은 장비에서 올라오는 데이터들을 하나의 pool에 저장하시는 부분과 이 pool의 내용을 읽어들여서 DB로 저장하는 부분으로 분리하시는 것이 어떨까 합니다. 그러면 데이터들이 올라오는 부분은 이벤트로 처리가 될것이고, 데이터를 DB로 저장하는 부분만 쓰레드로 작성하신 후에 계속 data pool만 감시를 하시면 될것 같은데요....
:
: 그럼, 좋은 결과 있으시길 바랍니다.
:
:
:

+ -

관련 글 리스트
41952 [질문] 스레드와 ADO 사용에 관해서... 초보 1507 2005/09/20
41954     Re:[질문] 스레드와 ADO 사용에 관해서... smleelms 1549 2005/09/20
41955         Re:Re:[감사] 답변 감사합니다. 초보 980 2005/09/21
41958             Re:Re:Re:[감사] 답변 감사합니다. smleelms 1701 2005/09/21
41962                 Re:Re:Re:Re:[감사] 답변 감사합니다. 초보 1702 2005/09/21
41966                     Re:Re:Re:Re:Re:[감사] 답변 감사합니다. smleelms 1103 2005/09/21
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.