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
[37259] Re:criticalsection 사용시..
멀더 [mulder] 2303 읽음    2004-09-14 11:06
안녕하세요. 멀더입니다.
님께서 올리신 소스를 보니, 별루 이상한곳이 없는것 같습니다.

CS와 관련된 곳에서 사용했던 저의 클래스를 올려 드립니다.
대략 별문제 없이 잘 사용되고 있습니다. (WINAPI)
그리고, VC와 같이 사용할수 있는 클래스입니다.

저의 경험을 하나 말씀드리자면
멀티쓰레드에서 하나의 UI를 동기화 해서 제어하는건 이론처럼 안될수가 있더군요.
저같은경우에는 SendMessage를 적극 이용하고 있습니다..
그럼 대부분의 경우 UI문제가 사라지더군요.... 물론 동기화도 안했구요.
역시 윈도우프로그램은 메시지기반으로 작성하는게 답이 아닐런지... :)




공부맨 님이 쓰신 글 :
: 어제 저녁에 함 글 올렸다가 지우고 이러저러하게 다시 해보고 올립니당..
:
: 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 사용시.. 공부맨 1305 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.