即時通訊嘗試在我的項目的不同對象中具有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