Тема реализована как Singleton

71
4

У меня есть коммерческое приложение, созданное с C, С++/Qt на платформе Linux. Приложение собирает данные с разных датчиков и отображает их в графическом интерфейсе. Каждый из протоколов для взаимодействия с датчиками реализуется с использованием шаблона singleton и потоков из класса 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
}


Иерархия графического интерфейса.


Экран 1.Login.
2. Экран действия.


Когда пользователь входит в систему с экрана входа в систему, мы вводим экран действия, на котором отображаются все данные, и начинается весь поток для разных датчиков. Они ожидают переменную mStop в режиме простоя, и когда данные поступают, они переходят к получению и обработке данных. Входящие данные для протокола проблемы составляют 117 байт. В основных потоках графического интерфейса есть таймеры, которые при тайм-ауте захватывают исполняемый экземпляр протокола, используя


   <ProtocolName>::instance() function

Проверьте переменную обновления для одноэлементного класса, если она истинна и отображает данные. Когда отображение данных завершено, они reset изменяют переменную обновления в одноэлементном классе на false. Проблематичный протокол имеет время обновления 1 с, что также является частотой кадров протокола. Когда я комментирую функцию отображения, она работает нормально. Но когда дисплей активирован, приложение зависает последовательно через 6-7 часов. Я задал этот вопрос на многих форумах, но не получил никаких полезных предложений. Надеюсь, что здесь я получу помощь. Кроме того, я прочитал много литературы по Singleton, многопоточность и обнаружил, что люди всегда препятствуют использованию синглетов, особенно на С++. Но в моем приложении я не могу придумать никакой другой дизайн для реализации.


Заранее спасибо


Беспроигрышный программист

спросил(а) 2020-03-25T20:31:51+03:00 1 неделя, 4 дня назад
1
Решение
62

Я думаю, что singleton на самом деле не то, что вы ищете. Рассмотрим это:


У вас есть (скажем) два датчика, каждый со своим протоколом (частота кадров, для нашей цели).


Теперь создайте классы "сервер" для каждого датчика вместо явного синглета. Таким образом, вы можете скрыть детали работы ваших датчиков:


class SensorServer {
protected:
int lastValueSensed;
QThread sensorProtocolThread;
public:
int getSensedValue() { return lastValueSensed; }
}

class Sensor1Server {
public:
Sensor1Server() {
sensorProtocolThread = new Sensor1ProtocolThread(&lastValueSensed);
sensorProtocolThread.start();
}
}

class Sensor1ProtocolThread : public QThread {
protected:
int* valueToUpdate;
const int TIMEOUT = 1000; // "framerate" of our sensor1
public:
Sensor1ProtocolThread( int* vtu ) {
this->valueToUpdate = vtu;
}
void run() {
int valueFromSensor;
// get value from the sensor into 'valueFromSensor'
*valueToUpdate = valueFromSensor;
sleep(TIMEOUT);
}
}

Таким образом, вы можете покончить с необходимостью создания синглета.


Приветствия,


JRH.

ответил(а) 2020-03-25T20:44:36.527654+03:00 1 неделя, 4 дня назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема