|
아래 질문에 대충 썼는데 해결이 안되어서 다시 질문드립니다.
============================================================================
메인폼에서 인스턴스로 가지고 있는 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 써도 마찬가지고...
이게 왜 그런지 원인을 아시는분 가르침을 주십시요.
|