|
멀티포트를 이용해서 여러개의 시리얼 포트를 제어 하려고 하는 의도로 스레드를 한 5개정도 돌릴 생각이었습니다. 동기화 하려면 눈앞이 깜깜하군요-,.-;
멀더 님이 쓰신 글 :
: 안녕하세요. 멀더입니다.
: 님께서 올리신 소스를 보니, 별루 이상한곳이 없는것 같습니다.
:
: 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이외의 일반 데이터 변수(또는 클래스)들은 제가 위와같이 사용해도 문제없는거겠죠?-_-
|