У меня есть приложение, которое работает на управляющем оборудовании, связанном с различными датчиками. При загрузке приложения он проверяет отдельные датчики один за другим, чтобы увидеть, существует ли надлежащая связь с датчиком в соответствии с предварительно определенным протоколом.
Теперь я реализовал код для проверки связи с отдельным датчиком в виде одноэлементного потока, и далее следует функция запуска, он использовал системный вызов select и канал для межпроцессного взаимодействия, чтобы сигнализировать об окончании потока.
void SensorClass::run()
{
mFdWind=mPort->GetFileDescriptor();
fd_set readfs;
int max_fd = (mFdWind > gPipeFdWind[0] ? mFdWind : gPipeFdWind[0]) + 1;
int res;
mFrameCorrect=false;
qDebug("BEFORE WHILE");
while(true)
{
qDebug("\n IN WHILE LOOP");
usleep(50);
FD_ZERO(&readfs);
FD_SET(mFdWind,&readfs);
FD_SET(gPipeFdWind[0],&readfs);
res=select(max_fd,&readfs,NULL,NULL,NULL);
if(res < 0)
perror("Select Failed");
else if(res == 0)
puts("TIMEOUT");
else
{
if(FD_ISSET(mFdWind,&readfs))
{
puts("*************** RECEIVED DATA ****************");
mFrameCorrect=false;
FlushBuf();
//int n=mPort->ReadPort(mBuf,100);
int n=mPort->ReadPort(mBuf,100);
if(n>0)
{
Count++;
QString str((const char*)mBuf);
//qDebug("\n %s",qPrintable(str));
//See if the Header of the frame is valid
if(IsHeaderValid(str))
{
if( (!IsCommaCountOk(str)) || (!IsChecksumOk(str,mBuf)) || (!CalculateCommaIndexes(str)) )
{
qDebug("\n not ok");
mFrameCorrect=false;
} //if frame is incorrect
else
{
qDebug("\n OK");
mFrameCorrect=true;
}//if frame is correct(checksum etc are ok)
}//else if header is ok
}//if n > 0
}//if data received FD_ISSET
if(FD_ISSET(gPipeFdWind[0],&readfs))
break;
}//end nested else res not <= 0
}//infinite loop
}
Вышеуказанный поток запускается из основного потока GUI. Это работает нормально. Проблема в том, что я дал пользователю возможность повторной проверки подсистемы по своему усмотрению. Для этого я удаляю экземпляр синглтона, используя
delete SensorClass::instance();
, а затем перезапустите синглтон, используя
SensorClass::instace()->start();
Проблема в том, что на этот раз, когда элемент управления выходит из функции while в run (), сразу после входа в цикл while, я предполагаю, что чтение канала снова считывалось из канала записи, который был записан в последний раз. Я пытался использовать fflush () для очистки ввода / вывода, но не повезло.
Мой вопрос
Думал ли я на правильном пути?
Если да, то как мы можем очистить трубы?
Если нет, никто не может подсказать, почему выборочный повторный тест не работает?
Заранее спасибо ..