2011-01-14 10 views
5

मैं इस पर घंटों तक काम कर रहा हूं और इसे समझ नहीं सकता और न ही मुझे काम करने वाली कोई मदद मिल सकती है। मूल रूप से जो मैं पूरा करने की कोशिश कर रहा हूं उसका सारांश एक बटन और QTextBrowser के साथ एक क्यूटी जीयूआई होना है। जब मैं बटन दबाता हूं तो मैं इसे एक संदेश डायल करना चाहता हूं और फिर हर 10 सेकंड में इस संदेश को प्रिंट करना जारी रखता हूं।क्यूटी: QTextBrowser को प्रत्येक 10 सेकंड में एक संदेश मुद्रित करने के लिए QTimer का उपयोग कैसे करें?

मुझे लगा कि मैं क्यूटीमर का उपयोग करूंगा क्योंकि यह हर 10 सेकंड में संदेश को डायल करने के लिए टाइमर रखना समझ में आता है। जब मैंने मूल रूप से इसे अपने बटनक्लिक() एसएलओटी में लागू किया, तो इसने प्रोग्राम को फ्रीज कर दिया। मैंने एक समाधान के लिए ऑनलाइन देखा और QAplication :: processEvents() पाया।

तो मेरी समारोह में मूल रूप से मैं कुछ इस तरह था:

while(1) 
{ 
    QTimer *timer; 
    connect(...) //omitted parameters for this example  
    timer.start(10000); 
    ui->diplay->append("Message"); 

    while(timer.isActive()) 
    { 
     QApplication::processEvents() 
    } 
} 

मैं लगा यह timer.isActive() से बाहर है, जबकि पाश टूट जाएगा लेकिन ऐसा नहीं यह बस वहाँ में रहता होगा।

तो मुझे लगा कि यह एक थ्रेडिंग मुद्दा है। तो मुझे पता चला कि QThreads का उपयोग कैसे करें लेकिन मैं अभी भी इसे काम नहीं कर सकता। असल में जब मैं उस पर एक टाइमर के साथ धागा बना देता हूं और थ्रेड टाइमर को शुरू करने के लिए कहता है, प्रोग्राम बंद हो जाता है और कंसोल कहता है "कार्यक्रम अप्रत्याशित रूप से समाप्त हो गया है"।

ऐसा करने के लिए एक आसान तरीका हो गया है लेकिन क्यूटी के साथ अपने ट्रैक रिकॉर्ड हमेशा

+0

अद्यतन: मैं अब का उपयोग कर रहा timer-> singleShot (टाइमर, संकेत (टाइमआउट()), इस, स्लॉट (अद्यतन())) ; लेकिन मुझे संदेश मुद्रित करने के लिए कार्यक्रम की आवश्यकता है और प्रसंस्करण जारी रखने से पहले 10 सेकंड प्रतीक्षा करें। मेरे पास थोड़ी देर में लूप है इसलिए यह लगातार हर 10 सेकंड में सिंगलशॉट कर रहा है। कोई सुझाव? धन्यवाद! –

+1

क्या लगभग हर कोई इस तथ्य को याद कर रहा है कि यह थोड़ी देर में हो रहा है (1) लूप? कोई आश्चर्य नहीं कि कार्यक्रम ठंडा है। –

उत्तर

6

वें आप 10s के लिए अपने संदेश प्रदर्शित करने के लिए चाहते हैं, तो बेहतर तरीका है कि, एक बनाने के लिए क्या करना है कि आपके एप्लिकेशन में स्लॉट जो संदेश मिटा देगा। फिर, अपने बटन को सक्रिय स्लॉट क्लिक किया, तो आपका संदेश जोड़ सकते हैं और एक टाइमर जो 10s में अपने निकालें संदेश स्लॉट ट्रिगर किया जाएगा प्रारंभ:

QTimer::singleShot(10000, this, SLOT(eraseMessageSlot())); 

इसके अलावा, वहाँ एक धागा की कोई आवश्यकता नहीं ...

+0

मैंने सोचा कि मुझे धागे की आवश्यकता है क्योंकि यह ठंडा था लेकिन जाहिर है कि मेरे पास गलत कनेक्शन था। –

+0

ओपी में मेरे अपडेट की समीक्षा करें। धन्यवाद! –

4

है आपका कोड में कई समस्याएं हैं - मुझे लगता है कि यह छद्म कोड है, अनिवार्य रूप से, क्योंकि timer मौजूद नहीं है और ऐसी चीजें हैं।

QTimer संदर्भ देखें। यह एक उदाहरण है:

QTimer *timer = new QTimer(this); 
connect(timer, SIGNAL(timeout()), this, SLOT(update())); 
timer->start(1000); 

मूल रूप से, आप एक स्लॉट है कि संलग्न कर देता है बनाना चाहते हैं, तो यह timeout सिग्नल से कनेक्ट और टाइमर शुरू करते हैं। टाइमर टिक जाएगा और हर दूसरे स्लॉट को कॉल करेगा। आपके मामले में, आप 1000 से 10000

यदि यह काम नहीं कर रहा है, तो आप वास्तव में क्या समस्याएं बदल रहे हैं? मुझे समझ में नहीं आता कि आप धागे का उपयोग क्यों कर रहे हैं, जब तक कि आपको वैसे भी उनकी आवश्यकता न हो।

संपादित करें अपने अपडेट को देखते हुए, आप कहते हैं कि आप 10 सेकंड तक प्रतीक्षा करना चाहते हैं। व्यस्त प्रतीक्षा के बजाय, अपने स्लॉट में प्रोग्राम क्यों जारी नहीं रखें (singleShot द्वारा बुलाया गया)? मुझे लगता है कि आप कुछ क्यूटी दर्शन खो रहे हैं ...

+0

यह मूल रूप से मेरे पास था। ऐसा प्रतीत होता है कि मैं 'इस पैरामीटर' को भूल गया और नोटिस नहीं किया। बहुत लंगड़ा मानते हुए मैंने सही पैरामीटर के साथ कुछ पंक्तियों को एक कनेक्ट स्टेटमेंट का उपयोग किया। किसी कारण से संकलक ने मुझे चिल्लाया नहीं था। –

1

डिफ़ॉल्ट रूप से, क्यूटीमर हर अंतराल को तब तक फेंक देगा जब तक आप इसे रोक नहीं देते। यही कारण है कि timer.isActive() हमेशा सच है। केवल एक बार टाइमर आग बनाने के लिए timer.setSingleShot(true) का उपयोग करें। (या @ tibur की पोस्ट में QTimer::singleShot का उपयोग करें।)

1

मैंने सोचा कि ओपी हर 10secs बार बार बार संदेश प्रदर्शित करना चाहता था?

किस मामले में बस एक टाइमर बनाएं, टाइमर सिग्नल के साथ एक अपडेट डिस्प्ले() फ़ंक्शन स्लॉट कनेक्ट करें और टाइमर शुरू करें।

4

यह इस तरह अपने कार्यक्रम को व्यवस्थित करने के लिए बेहतर होगा:

class MainWindow : QWidget //or any other parent class 
{ 
public: 
MainWindow() 
{ 
    QPushButton *button = new QPushButton(this); 
    browser_ = new QTextBrowser(this); //and some params maybe 
    QVBoxLayout * layout = new QVBoxLayout(this); //can be used another layout 
    layout->addWidget(button); 
    layout->addWidget(browser_); 

    connect(button, SIGNAL(pressed()), 
     this, SLOT(onButtonPressed())); 

    timer_ = new QTimer(this); 
    connect(timer, SIGNAL(timeout()), 
     this, SLOT(timerHandler())); 
    } 
    ~MainWindow(); 

public slots: 
    void onButtonPressed() 
    { 
     timerHandler(); //to display message when button is pressed 
     if (!timer->isActive()) timer->start(TIMER_INTERVAL); //TIMER_INTERVAL = 10000; 
    } 
    void timerHandler() 
    { 
     //put your code to display message here 
    } 

private: 
    QTextBrowser *browser_; 
    QTimer *timer_; 
} 
+0

इस तरह से इसे क्यूटी में संरचित किया जाना चाहिए। प्रत्येक 10 सेकंड, टाइमर टाइमर हैंडलर फ़ंक्शन को कॉल करेगा। उस फ़ंक्शन में, बस अपना संदेश संलग्न करें और फ़ंक्शन से बाहर निकलें। सरल और सीधा, और सबसे महत्वपूर्ण बात यह है कि कार्यक्रम को स्थिर करने के कारण कोई अनंत लूप नहीं होता है। –

+0

मुझे बटन पर दबाया गया है()। यह टाइमर हैंडलर() को कॉल करेगा चाहे टाइमर सक्रिय है या नहीं। जहां तक ​​मैं टाइमर को बता सकता हूं, समय समाप्त होने के बाद खुद को रीसेट करने के अलावा यहां कुछ भी नहीं है। जहां तक ​​मैं कह सकता हूं कि यह बटन हर बार जब आप बटन दबाएंगे तो संदेश प्रदर्शित करेगा। –

+0

बटन को सक्रिय किया जाता है जब बटन स्लॉट में दबाया जाता है बटन पर दबाया जाता है); क्योंकि अगर (! टाइमर-> isActive()) टाइमर-> प्रारंभ करें (TIMER_INTERVAL); बुलाया जाएगा – Andrew

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

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