2011-06-06 15 views
6

से शुरू नहीं किया जा सकता है मैं क्यूटी एसडीके से उदाहरण का पालन करें, QThread उपवर्ग में टाइमर शुरू करने, लेकिन मैं चेतावनी मिलती रहती है और धागा घड़ी कभी नहीं शुरू होता है।क्यूटी धागे: हो रही है QObject :: startTimer: टाइमर एक और धागा चेतावनी

NotificationThread::NotificationThread(QObject *parent) 
      :QThread(parent), 
      m_timerInterval(0) 
{ 
moveToThread(this); 
} 


NotificationThread::~NotificationThread() 
{ 
; 
} 

void NotificationThread::fire() 
{ 
    WRITELOG("A::fire called -- currentThread:" + QString::number((int)currentThread()->currentThreadId())); 
    QVector<StringPer>* batchVectorResult = new QVector<StringPer>(); 
    emit UpdateGroupNotifications(batchVectorResult); 

} 

void NotificationThread::run() 
{ 

     connect(&m_NotificationTimer, SIGNAL(timeout()), 
       this,SLOT(fire(),Qt::DirectConnection)); 

     WRITELOG("A::run() worker thread -- currentThread:" + QString::number((int)currentThread()->currentThreadId())); 
    //SetNotificationTimerFromConf(); 
    QVariant val(ConfigSettings::getInstance()->ReadFromSettingsReturnVariant(SETTINGS_KEY_NOTIFICATIONTHREAD)); 
    int interval = val.toInt(); 
    m_NotificationTimer.setInterval(interval); 
     m_NotificationTimer.start(); 

     QThread::exec(); 
} 


void NotificationThread::SetNotificationTimerFromConf() 
{ 
QVariant val(ConfigSettings::getInstance()->ReadFromSettingsReturnVariant(SETTINGS_KEY_NOTIFICATIONTHREAD)); 
int interval = val.toInt(); 
m_NotificationTimer.setInterval(interval); 
} 


void NotificationThread::UpdateNotificationTimerRT(int timerInterval) 
{ 
m_NotificationTimer.setInterval(m_timerInterval); 
} 


void NotificationThread::Execute(const QStringList batchReqList) 
{ 
QVector<QString>* batchVectorResult = new QVector<QString>(); 
start(); 
} 

मैं Execute() साथ मुख्य जीयूआई से धागा शुरू: यहाँ कोड है।

उत्तर

7

साथ run() में टाइमर बनाने

m_NotificationTimer.moveToThread(this); 

की शुरुआत से() आपके टाइमर ऑब्जेक्ट पर उस बिंदु से आपके थ्रेड की विधि आपके थ्रेड के भीतर कनेक्टेड स्लॉट का आह्वान करेगी।

जब आप पहली बार टाइमर बनाते हैं तो यह आपके मुख्य थ्रेड के भीतर चला जाएगा। moveToThread विधि के ऊपर के रूप में इसे अपने स्वयं के धागे पर ले जाकर टाइमर ऑब्जेक्ट के थ्रेड एफ़िनिटी को बदल देगा।

10

समस्या यह है कि जब आप अपना थ्रेड ऑब्जेक्ट बनाते हैं तो आप मुख्य थ्रेड द्वारा टाइमर को पूरी तरह से बनाते हैं। ऐसा इसलिए है क्योंकि आपका टाइमर आपकी थ्रेड क्लास का सदस्य है।

जब आप टाइमर शुरू करने का प्रयास करते हैं, तो आप एक अलग थ्रेड (run() में) करते हैं, थ्रेड में नहीं, जहां टाइमर बनाया गया था, जो आपको चेतावनी देता है।

आपको उस थ्रेड में टाइमर बनाने की आवश्यकता है जहां आप इसे चलाने के लिए चाहते हैं:।

QTimer* m_NotificationTimer; 

को

QTimer m_NotificationTimer; 

से अपने NotificcationThread कक्षा में m_notificationTimer की घोषणा को बदलें और आप लाइन जोड़ देते हैं तो

m_NotificationTimer = new QTimer(this); 
m_NotificationTimer->setInterval(interval); 
m_NotificationTimer->start(); 
+0

या सिर्फ एक प्रारंभकर्ता सूची का उपयोग करें: वर्ग MyClass: सार्वजनिक QObject { Q_OBJECT सार्वजनिक: MyClass(): m_thread (यह) {} QTimer m_timer; } – nocnokneo

2

यह भी इस article

सबसे बड़ी समायोजन मेरे लिए यह समझना होगा कि क्यूटी में धागे एक अंतरफलक के रूप में इस्तेमाल कर रहे हैं, और वास्तव में उपवर्गीकरण के लिए नहीं हैं था उल्लेख के लायक है। ऐसा कहा जा रहा है कि, मैं आपकी कक्षा और वास्तविक QThread अलग रखूंगा। और उसके बाद बस अपने सिग्नल और स्लॉट उस थ्रेड पर प्रक्रिया सुनिश्चित करने के लिए YourClass.moveToThread (& YourQtThread) का उपयोग करें।

+0

लेख से जुड़ा हुआ http://blog.qt.digia.com/blog/2010/06/17/youre-doing-it-wrong/ – hcc23

+0

जानकारी के लिए धन्यवाद। मैंने लिंक अपडेट किया – Aki

संबंधित मुद्दे