У меня есть коммерческое приложение, созданное на C, C ++ / Qt на платформе Linux. Приложение собирает данные с разных датчиков и отображает их в графическом интерфейсе. Каждый из протоколов взаимодействия с датчиками реализован с использованием одноэлементного шаблона и потоков из класса Qt QThreads. Все протоколы, кроме одного, работают нормально. Каждая функция запуска протокола для потока имеет следующую структуру:
void <ProtocolClassName>::run()
{
while(!mStop) //check whether screen is closed or not
{
mutex.lock()
while(!waitcondition.wait(&mutex,5))
{
if(mStop)
return;
}
//Code for receiving and processing incoming data
mutex.unlock();
} //end while
}
Иерархия GUI.
1.Вход на экран.
2. Экран действий.
Когда пользователь входит в систему с экрана входа в систему, мы открываем экран действий, где отображаются все данные и запускаются все потоки для разных датчиков. Они ждут переменную mStop во время простоя, а когда данные поступают, они переходят к получению и обработке данных. Входящие данные для протокола проблемы составляют 117 байтов. В основных потоках GUI есть таймеры, которые по истечении времени ожидания захватывают запущенный экземпляр протокола, используя
<ProtocolName>::instance() function
Проверьте переменную обновления одноэлементного класса, если она истинна, и отобразите данные. Когда отображение данных завершено, они сбрасывают переменную обновления в синглтон-классе на false. Проблемный протокол имеет время обновления 1 с, что также является частотой кадров протокола. Когда я закомментирую функцию отображения, она работает нормально. Но при включенном дисплее приложение зависает стабильно через 6-7 часов. Я задавал этот вопрос на многих форумах, но не получил достойных предложений. Надеюсь, что здесь мне помогут. Кроме того, я прочитал много литературы по Singleton, многопоточности, и обнаружил, что люди всегда препятствуют использованию синглетонов, особенно в C ++. Но в моем приложении я не могу представить никакой другой дизайн для реализации.
Заранее спасибо
Несчастный программист