即时通讯尝试在我的项目的不同对象中具有qthread的范围。所以我试图让线程成为一个单身人士。它是一个用作客户端的DBUS接口。使qthread作为单身人士消耗大量的CPU负荷
这是我实施的代码。 .H
class ClientDBUSThread : public QThread
{
Q_OBJECT
public:
static ClientDBUSThread *getInstance();
void messageReceived(QString);
private:
ClientDBUSThread();
static ClientDBUSThread *instance;
static QMutex instanceMutex;
void run();
signals:
void signalReceivedInDBUS(QString);
public Q_SLOTS:
void mySlot(QString);
void stop();
private:
DemoIf* client ;
QMutex m_mutex;
bool m_stop;
};
和.cpp
#include "ClienDBusThread.h"
#include <QMap>
ClientDBUSThread *ClientDBUSThread::instance(0);
QMutex ClientDBUSThread::instanceMutex;
ClientDBUSThread *ClientDBUSThread::getInstance()
{
if (!instance) {
QMutexLocker instanceMutexLocker(&instanceMutex);
if (!instance) {
instance = new ClientDBUSThread();
}
}
return instance;
}
ClientDBUSThread::ClientDBUSThread()
{
m_stop = false;
client = new DemoIf("com.nokia.Demo", "/", QDBusConnection::sessionBus(), 0);
connect(client, SIGNAL(LateEvent(QString)), this, SLOT(mySlot(QString)));
QDBusConnection cnn= client->connection();
qDebug()<<"is the DBUS gets connected:"<<cnn.isConnected();
const QMap<QString, QVariant> hi;
client->SayHello("HELLO THERE HOW ARE YOU", hi);
client->SayBye();
}
void ClientDBUSThread::run()
{
while (1) {
QMutexLocker locker(&m_mutex);
if (m_stop) break;
}
}
void ClientDBUSThread::stop()
{
QMutexLocker locker(&m_mutex);
m_stop=true;
client->SayBye();
}
void ClientDBUSThread::messageReceived(QString message)
{
const QMap<QString, QVariant> hi;
client->SayHello(message, hi);
}
void ClientDBUSThread::mySlot(QString data)
{
emit signalReceivedInDBUS(data);
}
而声明等
theDBUSThread = ClientDBUSThread ::的getInstance()的对象; 这很好,但启动线程
theDBUSThread-> start();
CPU负载超过PC的100%。即时消息只在主类中启动线程。剩下的课只是宣布和使用DBUS收到的信号。
使用'qDebug()<<的QThread :: currentThreadId();'检查如果你的代码运行在一个单独的线程中或者没有运行 – Zaiborg 2014-11-24 06:36:00
当然代码是作为单独的线程运行的。它不会阻止我的GUI流程,并且还会重新考虑我对注释线程的怀疑,并仅检查GUI。没关系..只有线程给CPU的负载更大.. – Wagmare 2014-11-24 06:48:41
我还没有重写QThreads的运行方法,所以我只能假设问题出现在while循环中。我通常使用一个工作对象,使用'QObject :: moveToThread()'移动到特定的线程。 – Zaiborg 2014-11-24 06:56:54