|
안녕하세효
수야!╋랍니다.
WaitForSingleObject 함수 아래로 진행이되면 이상한거 같은데요...
씽크로나이즈나 크리티컬과는 전혀 무관한 문제같은데요..
WaitForSingleObject함수 아래를 진행하고 싶으시다면 원하시는 진행사항들이 완료된 후에
SetEvent(m_pPlcMon->Handle);
를 하셔야.. 해당 이벤트를 기다리던 WaitForSingleObject에서 이제 아래로 내려가되 되는구나 하고 내려가게 됩니다.
특정 시간이 지난후에는 이벤트가 없었더라도 진행되기를 원하신다면
WaitForSingleObject함수의 두번째 인자에 대기시간을 넣으시면 됩니다. 단위는 1ms 입니다.(1000 = 1초)
마지막으로 함수를 사용하실때 아무리 영어 헬프라지만 훝어보시면 대략 어떻게 써야되는지는 아실 수 있을테니 한번 찾아보시기를 권장합니다.
수야!╋였습니다.
최상천 님이 쓰신 글 :
: 아래 질문에 대충 썼는데 해결이 안되어서 다시 질문드립니다.
:
: ============================================================================
:
: 메인폼에서 인스턴스로 가지고 있는 RS-232 통신 클래스가 있습니다. ==> m_pPlc
: class TFormMain : public TForm
: {
: public:
: TPlc *m_pPlc;
: 스레드 *m_pPlcMon;
: };
:
: 이(TPlc) 클래스 메소드중에 아래와 같은 메소드가 있습니다.
: 이 메소드를 실행하는데 약 3초 정도 걸립니다.
: TPlc::SendString
: {
: g_pCS1->Acquire ();
: .
: .
: .
: g_pCS1->Release ();
: }
:
: 문제는 스레드함수1이 SendString 함수를 계속적으로 호출하는 기능을 합니다.
:
: m_pPlcMon::스레드함수1
: {
: //---- Place thread code here ----
: //AnsiString Str;
: while (!Terminated)
: {
: Str = SendString ();호출
: if (!Str.IsEmpty())
: SendMessage (m_hHandle, PLC_RESPONSE, NULL, (LPARAM)Str.c_str());
: Sleep (1);
: }
: }
:
: 메인폼에서 버튼을 누를때 아래와 같습니다.
: 위에 스레드1을 죽이죠.
: void __fastcall TFormMain::ButtonClick()
: {
: if (m_pPlcMon)
: {
: m_pPlcMon->Terminate ();
: WaitForSingleObject ((HANDLE)m_pPlcMon->Handle, INFINITE);
: delete m_pPlcMon;
: m_pPlcMon = NULL;
: }
: }
:
: 그런데 버튼만 누르면 WaitForSingleObject 함수 아래로 진행이 안되네요.
: 많은 방법을 다 동원 해 봤지만 도저히 해결을 할 수가 없는데...
: 스레드가 가 Critical Section 내부에 들어갔을때 m_pPlcMon->Terminate (); 이 부분이 문제가
: 되는건지....Synchronize 써도 마찬가지고...
:
: 이게 왜 그런지 원인을 아시는분 가르침을 주십시요.
|