2010-05-09 13 views
10

मैं एक धागा है कि मुख्य नहीं है में exec करने के लिए() एक QApplication जरूरत है (मेरे GUIs वाले प्लग इन गतिशील रूप से लोड किया जा सकता है और रनटाइम पर उतार दिया होना चाहिए, तो मैं मुख्य थ्रेड के लिए कोई उपयोग कर सकते है) । क्या किसी को मुख्य रूप से QApplication शुरू करने के खिलाफ क्यूटी के प्रतिबंध के आसपास हैक करने के लिए (अपेक्षाकृत) दर्द रहित तरीका पता है?QApplication गैर मुख्य थ्रेड में

मैं जीसीसी 4.3.4 का उपयोग कर सी ++ में क्यूटी 4 के साथ लिनक्स में विकास कर रहा हूं।

उत्तर

4

आप QThread का उपयोग कर रहे हैं तो आप पहले से ही सामान्य क्यूटी घटना पाश है और सिर्फ कार्यकारी() QThread :: रन() फ़ंक्शन के अंदर चला सकते हैं। जबकि आप मुख्य थ्रेड के बाहर जीयूआई ऑब्जेक्ट्स के साथ काम नहीं कर सकते हैं, फिर भी आप कतारबद्ध सिग्नल/स्लॉट कनेक्शन के माध्यम से उनके साथ बातचीत कर सकते हैं। हो सकता है कि आप पॉइंटर को मुख्य थ्रेड QThread ऑब्जेक्ट में स्टोर करने का प्रयास कर सकते हैं और QObject :: moveToTread() को अपने GUI ऑब्जेक्ट्स को मुख्य थ्रेड में स्थानांतरित करने के बजाय QApplication को किसी अन्य थ्रेड में स्थानांतरित करने के लिए कॉल कर सकते हैं।

मुझे लगता है कि यह हैक्स और kluges के विभिन्न प्रकार के साथ टूलकिट के खिलाफ जाने की कोशिश करने के लिए अच्छा विचार वास्तव में नहीं है।

+0

मुझे लगता है कि आप सही हो सकते हैं, VestniK - जबकि मेरा जीयूआई वास्तव में चलता है, यह वास्तव में सेवा अद्यतन() कॉल नहीं लगता है जब तक कि मैं ओएस को इसके ऊपर के चारों ओर एक और विंडो खींचकर जीयूआई को फिर से चलाने के लिए मजबूर नहीं करता। – rcv

+0

मुझे यह उत्तर किसी अन्य समस्या को हल करने के लिए उपयोगी पाया गया है, लेकिन QMainWindow ऑब्जेक्ट को किसी अन्य थ्रेड से मुख्य पर ले जाने के दौरान मुझे 'QObject :: moveToTread: विजेट को नए थ्रेड में स्थानांतरित नहीं किया जा सकता है' – ASten

1

पैच क्यूटी, मुझे लगता है और मुख्य थ्रेड चेक को हटा दें, और परीक्षण करें कि यह आपके लिए काम करता है। http://bugreports.qt-project.org/browse/QTBUG-7393 कि हालांकि पर ओएस एक्स/कोको काम नहीं करेगा, कोको मान लिया गया है के रूप में पहली धागा मुख्य/यूआई धागा होने के लिए पैदा की के अनुसार।

1

ठीक है, मुझे कुछ काम मिल गया है! यह सुंदर नहीं है, लेकिन यह निश्चित रूप से नौकरी करता है।

  1. एक वर्ग यह अपने वास्तविक जीयूआई कोड के सभी के साथ एक QMainWindow व्युत्पन्न बनाएँ और ओवरलोड इस वर्ग की घटना() फ़ंक्शन इस- कॉल करने के लिए> शो()

  2. बनाएँ (यह कॉल धावक) जो आपके QMainWindow व्युत्पन्न को पॉइंटर रखेगा, और इसे एक रन फ़ंक्शन देगा।

  3. धावक :: धावक() में,) एक धागा जो धावक फोन करेगा :: रन()

  4. धावक में :: रन ((जो अब उसके अपने सूत्र में चल रहा है) का निर्माण शुरू एक QAplication, और आपके QMainWindow व्युत्पन्न का एक तात्कालिकता। QApplication के exec() फ़ंक्शन को कॉल करें।

  5. अब, जब आप अपना जीयूआई शुरू करना चाहते हैं, तो बस किसी भी घटना को अपने QMainWindow व्युत्पन्न में पोस्ट करें, और यह स्वयं दिखाएगा! हालांकि यह वास्तव में और क्यूटी में कुछ बचाव का शोषण किया जा रहा है अन्य प्लेटफार्मों पर काम न करे

यह समाधान, लिनक्स में बहुत अच्छी तरह से काम करने लगता है। हालांकि Qt पैचिंग से निश्चित रूप से आसान है।

+0

हे Boatzart, मैं एक ही चीज़ को हासिल करने की कोशिश कर रहा हूँ। जब आप कहते हैं "रनर :: रनर(), एक थ्रेड शुरू करें जो रनर :: रन()" कहलाएगा, तो आपका क्या मतलब है।एक और QThread शुरू करें जो रनर थ्रेड शुरू करेगा? लेकिन QAplication के निर्माण के बिना आप एक और धागा कैसे शुरू कर सकते हैं? – blueskin

8

आप के रूप में एक PThread में एक QApplication शुरू कर सकते हैं

नीचे

//main.cpp

#include <iostream> 
#include "appthread.h" 
int main(int argc, char *argv[]) { 
    InputArgs args = {argc, argv}; 
    StartAppThread(args); 
    sleep(10); 
    return 0; 
} 

//appthread.h

struct InputArgs{ 
    int argc; 
    char **argv; 
}; 
void StartAppThread(InputArgs &); 

//appthread.cpp

#include <QApplication> 
#include <QMainWindow> 
#include <QPushButton> 
#include "appthread.h" 
#include <pthread.h> 

void *StartQAppThread(void *threadArg) { 
    InputArgs *args = (struct InputArgs*) threadArg; 
    QApplication app(args->argc, args->argv); 
    QMainWindow w; 
    w.show(); 
    w.setCentralWidget(new QPushButton("NewButton")); 
    app.exec(); 
    pthread_exit(NULL); 
} 

void StartAppThread(InputArgs &args) { 
    pthread_t thread1; 
    int rc = pthread_create(&thread1, NULL, StartQAppThread, (void*)&args); 
} 
संबंधित मुद्दे