2013-02-15 18 views
7

मेरे पास GUI थ्रेड जो & बनाता है GUI सामग्री का प्रबंधन करता है। अब जब एप्लिकेशन निष्क्रिय है यानी सभी धागे निष्क्रिय हैं (या यहां तक ​​कि अगर केवल जीयूआई थ्रेड निष्क्रिय है) तो मैं विरासत वर्ग की ऑब्जेक्ट SIGNAL उत्सर्जित करना चाहता हूं। ताकि जब भी एप्लिकेशन निष्क्रिय हो, मैं चुपचाप अगले चरण के लिए Widgets तैयार कर दूंगा। तो मैं जानना चाहूंगा कि जब भी GUI थ्रेड निष्क्रिय है, तो मैं उस ऑब्जेक्ट को SIGNAL को उत्सर्जित करने के लिए कैसे कर सकता हूं? मेरा आवेदन बहु थ्रेडेड & में कई वर्ग हैं, इसलिए यह आवश्यक नहीं है कि SIGNALGUI कक्षा में केवल उत्सर्जित हो। इसके अलावा SIGNAL जैसे ही धागा निष्क्रिय हो जाता है, उत्सर्जित नहीं किया जाना चाहिए। मैं चाहता हूं कि थ्रेड पर्याप्त समय के लिए निष्क्रिय होना चाहिए ताकि मुझे यकीन हो कि उपयोगकर्ता वास्तव में निष्क्रिय है। धन्यवाद!जब सिग्नल में जीयूआई थ्रेड निष्क्रिय होता है तो सिग्नल उत्सर्जित करता है?

+2

यह उत्तर देखें - http://stackoverflow.com/a/6534069/667266 – borisbn

उत्तर

11

QAbstractEventDispatcher एक को अपनी घटनाओं को Qt's event loop में प्लग करने की अनुमति देता है। इसके अलावा यह इवेंट लूप के वर्कलोड की निगरानी करने की अनुमति देता है।

यहां एक उदाहरण है। विजेट QAbstractEventDispatcher :: जागृत() और QAbstractEventDispatcher :: aboutToBlock() सिग्नल के लिए सुन रहा है जब ईवेंट लूप व्यस्त है।

#include <QtGui> 

class IdleAwareWidget : public QWidget 
{ 
    Q_OBJECT 

public: 
    IdleAwareWidget(QWidget *parent = 0) : QWidget(parent) { 
     dispatcher = QAbstractEventDispatcher::instance(); 
     connect(dispatcher, SIGNAL(awake()), SLOT(awake())); 
     connect(dispatcher, SIGNAL(aboutToBlock()), SLOT(aboutToBlock())); 
    } 

private slots: 
    void awake() { 
     lastAwake = QTime::currentTime(); 
     qDebug() << "Slept for " << lastBlock.msecsTo(lastAwake) << " msec"; 
    } 

    void aboutToBlock() { 
     lastBlock = QTime::currentTime(); 
     qDebug() << "Worked for " << lastAwake.msecsTo(lastBlock) << " msec"; 
    } 

private: 
    QAbstractEventDispatcher *dispatcher; 
    QTime lastAwake; 
    QTime lastBlock; 
}; 

main.cpp:

#include <QtGui> 

#include "idle_widget.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    IdleWidget widget; 
    widget.show(); 

    return a.exec(); 
} 

सवाल सिर्फ बेकार प्रसंस्करण के बारे में है, तो 0 अंतराल के साथ QTimer एक विकल्प है:

QTimer::singleShot(0, this, SLOT(doWorkInIdle())); 

यह doWorkInIdle() स्लॉट के लिए कहते हैं निर्धारित करेगा जैसे ही ईवेंट लूप निष्क्रिय राज्य में जाता है। छोटे चक्स को काम बांटने से लूप को अवरुद्ध नहीं किया जाएगा और एप्लिकेशन उत्तरदायी रहेगा।

+0

उत्तर के लिए धन्यवाद! –

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