gpt4 book ai didi

c++ - 作为单例实现的线程

转载 作者:行者123 更新时间:2023-11-28 04:00:27 26 4
gpt4 key购买 nike

我有一个在 Linux 平台上使用 C、C++/Qt 制作的商业应用程序。该应用程序从不同的传感器收集数据并将其显示在 GUI 上。每个与传感器接口(interface)的协议(protocol)都是使用单例模式和来自 Qt QThreads 类的线程实现的。除一个协议(protocol)外,所有协议(protocol)都可以正常工作。每个协议(protocol)的线程运行函数结构如下:

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. Action 画面。

当用户从登录屏幕登录时,我们进入显示所有数据的操作屏幕,并启动不同传感器的所有线程。它们在空闲时间等待 mStop 变量,当数据到达时它们跳转到接收和处理数据。问题协议(protocol)的传入数据为 117 字节。在主 GUI 线程中有定时器,当超时时,使用

获取正在运行的协议(protocol)实例
   <ProtocolName>::instance() function

检查单例类的更新变量是否为真并显示数据。数据显示完成后,他们将单例类中的更新变量重置为 false。有问题的协议(protocol)的更新时间为 1 秒,这也是协议(protocol)的帧速率。当我注释掉显示功能时,它运行良好。但是,当显示被激活时,应用程序会在 6-7 小时后持续挂起。我在很多论坛上问过这个问题,但没有收到任何有值(value)的建议。我希望在这里我能得到一些帮助。另外,我阅读了很多关于单例、多线程的文献,发现人们总是不鼓励使用单例,尤其是在 C++ 中。但是在我的应用程序中,我想不出其他的实现设计。

提前致谢

一个倒霉的程序员

最佳答案

我认为单例并不是您真正要找的东西。考虑一下:

您有(比方说)两个传感器,每个传感器都有自己的协议(protocol)(帧速率,用于我们的目的)。

现在为每个传感器创建“服务器”类,而不是显式单例。这样您就可以隐藏传感器工作原理的详细信息:

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.

关于c++ - 作为单例实现的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1025511/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com