Привет! Необходимо реализовать работу с com-портом в асинхронном режиме. Нашел очень хорошую статью по теме
http://piclist.ru/S-COM-THREAD-RUS/S-COM-THREAD-RUS.html.
Сделал функцию чтения как написано (она запускается в отдельном потоке):
DWORD WINAPI ReadThread(LPVOID)
{
COMSTAT comstat;
DWORD btr, temp, mask, signal;
overlapped.hEvent = CreateEvent(NULL, true, true, NULL);
SetCommMask(COMPort, EV_RXCHAR);
while(!flag1)
{
WaitCommEvent(COMPort, &mask, &overlapped);
//ShowMessage("ok");
signal = WaitForSingleObject(overlapped.hEvent, INFINITE);
ShowMessage(IntToStr((int)signal));
if(signal == WAIT_OBJECT_0)
{
if(GetOverlappedResult(COMPort, &overlapped, &temp, true))
if((mask & EV_RXCHAR)!=0)
{
ClearCommError(COMPort, &temp, &comstat);
btr = comstat.cbInQue;
if(btr)
{
ReadFile(COMPort, bufrd, btr, &temp, &overlapped);
counter+=btr;
Form1->Memo1->Lines->Add(bufrd[0]);
}
}
}
}
flag2=1;
CloseHandle(overlapped.hEvent);
}
Для завершения потока автор использует функцию TerminateThread, которую использовать не рекомендует ни автор ни микрософт. Автор предлагает использовать флаги (пременные) для сигнализации завершения чтения. У меня программа все читает, но при попытке закрыть окно виснет. Подскажите как сделать по человечески, чтобы ничего не висло? Среда C++ Builder.