|
안녕하세요. heredity입니다.
멀티쓰레드 프로그래밍에서 가장 중요한 것 중 하나는 쓰레드간 동기화 문제입니다.
만약 VCL 객체를 참조하는 코드가 Thread내에 존재한다면
이 부분은 Syschronize()로 동기화 시켜야 합니다.
그리고 CreateThread() API를 이용해서 Thread를 만들면 VCL간 동기화가
어려우니(추가적인 코드를 작성해야 합니다 ^^;) 가급적 C++ Builder에서
제공되는 TThread class를 사용하시기 바랍니다.
TThread에 대한 사용 방법은 C++ Builder 설치 Folder내
...\Examples\Apps\Threads
를 참조하거나 이 곳(볼랜드 포럼)에서 검색해 보시기 바랍니다.
행복하세요.
ps. 프로그램이 종료시 또는 수행중 오류를 발생하며 정지하는 이유중 하나는
동기화에 문제가 있어서 나는 경우가 많습니다.
------------------------------
바부팅이 님이 쓰신 글 :
: 안녕하세요?...
: 제가요..
: 한 프로그램에서 쓰레드를 세번 사용하는데요..
:
: 제일 처음 쓰레드를 썼을때는 아무 문제가 없었습니다.
: (버튼1을 누르면 쓰레드1을 호출)
:
: 그러다가 또 다른 쓰레드를 만들었습니다. (버튼2를 누르면 쓰레드2를 호출)
: 그랬는데.. 메모장이 사라졌습니다.
:
: 이번에 세번째 쓰레드를 썼는데요.. (버튼3 클릭)
: 그 버튼클릭 이벤트가 끝나면 역시 메모장이 없어집니다..
:
:
: 프로그램을 종료하니까..
:
: Project1.exe raised exception class EWin32Error with message 'Win32Error. Code:1400. 잘못된 창 핸들입니다'. Process stopped. Use Step or Run to continue;
:
: 이런 에러 메시지가 나오면서..
:
: forms.hpp 에 있는
: /* TCustomForm.Destroy */ inline __fastcall virtual ~TForm(void) { }
: 문장으로 가네요..
:
:
: 쓰레드와 관련된 코드는...
:
: void __fastcall TForm1::Button3Click(TObject *Sender)
: {
: mStackThreadAA =
: CreateThread(0,0,(unsigned long (__stdcall *)(void *))callRunStackAA,this,0,&mStackThreadIdAA) ; // (윗줄이랑 이어진 문장임)
:
: }
:
: //-----------------------------------------
:
: NT callRunStackAA(LPVOID * p)
: {
: TForm1 * winStack = (TForm1 *) p ;
: winStack->bt_aa_testClick(Form1);
: CloseHandle(winStack->mStackThread1);
: //-----------------------------------------
:
: HANDLE mStackThreadAA ;
: ULONG mStackThreadIdAA ;
: friend UINT callRunStackAA(LPVOID * p) ;
:
: //-----------------------------------------
:
: 이렇고요..
:
: 쓰레드를 사용하고 나서 뭐.. 해제 이런거 해줘야 되나요?..
:
:
: 프로그램 초보인데.. 쓰레드도 어디서 참고해서 사용한 것입니다.
: 메모장이 왜 사라지는지.. 어떻게 조치해야 되는지.. 혹시 알수 있나요?...
: 부탁드리겠습니다... 그럼 수고하세요..
|