Закрытие окна приложения при чтении из COM-порта (асинхр.)
От: prg1000  
Дата: 07.10.10 08:19
Оценка:
Привет! Необходимо реализовать работу с 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.