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
[37254] criticalsection 사용시..
공부맨 [] 1304 읽음    2004-09-14 09:17
어제 저녁에 함 글 올렸다가 지우고 이러저러하게 다시 해보고 올립니당..

criticalsection으로 스레드간 동기화를 해보려하는데요.
간단히 테스트삼아 TCriticalSection 을 이용해서 ProgressBar를 2개의 스레드(메인 스레드 포함)에서 카운트 해보려하는데 동기화안하고 돌린것처럼 먹통이 되어 버립니다.

타이머 하나가 프로그레스바 카운트를 하구요.

TCriticalSection *CS = new TCriticalSection();
TThreadProc *ThreadProc;
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    Timer1->Enabled = false;
    CS->Enter();

    ProgressBar1->Position++;

    if (ProgressBar1->Position >= ProgressBar1->Max)
        ProgressBar1->Position = ProgressBar1->Min;

    CS->Leave();
    Timer1->Enabled = true;       
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    ThreadProc = new TThreadProc(false);
}
//---------------------------------------------------------------------------


버튼1을 누르면 스레드하나를 생성해서 마찬가지로 돌리는데..

extern TCriticalSection *CS;
//---------------------------------------------------------------------------
void __fastcall TThreadProc::Execute()
{
    while (!Terminated)
    {
        Sleep(10);                  //임시로 넣음.
        ChgUI();
    }
}
//---------------------------------------------------------------------------
void __fastcall TThreadProc::ChgUI()
{
    CS->Enter();
    Form1->ProgressBar1->Position++;

    if (Form1->ProgressBar1->Position >= Form1->ProgressBar1->Max)
        Form1->ProgressBar1->Position = Form1->ProgressBar1->Min;

    CS->Leave();
}
//---------------------------------------------------------------------------

영 잘 안됩니다. 어차피 Synchronize(ChgUI);를 해버리면 편하겠습니다만...
CriticalSection의 사용법이 잘못된건지 모르겠습니다.

신기한것은 criticalsection을 사용한 두 부분중 한곳을 지우고 실행하면 안죽고 잘만 돌아간다는 사실;;;
원래 공유변수에 접근하는 곳마다 임계영역을 지정해 줘야 되는거 아닌가요....


p.s.
검색중에 비슷한 경우가 있네요..유영인님이 synchronize를 사용하라는 답변을 올려놓으셨는데,

VCL접근시에는 그럼 꼭 synchronize만을 사용해야 하는건가요?

같은 동기화 목적으로 사용하는건데 criticalsection으로는 안되는건가요?
Synchronize소스를 보니 얼핏 내부에서 criticalsection을 사용하는것으로 보이는데 말이죠;;;
(Event관련도 보이는군...차이는 이것때문인가;;;;)

암튼...가장 중요한것은;;
VCL이외의 일반 데이터 변수(또는 클래스)들은 제가 위와같이 사용해도 문제없는거겠죠?-_-

+ -

관련 글 리스트
37254 criticalsection 사용시.. 공부맨 1304 2004/09/14
37259     Re:criticalsection 사용시.. 멀더 2303 2004/09/14
37268         Re:답변에 감사드립니다. (별냉무) 공부맨 1013 2004/09/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.