为什么我不能在基于QThread的类中使用全局变量?

时间:2011-10-07 16:57:51

标签: multithreading qt4 global-variables

假设最小的大小写包含一个名为Worker的类,基于QThread,另一个名为Parser,它是一个全局类,位于Worker类中。

# parser.h
class Parser;
extern Parser *App_Parser;

class Parser {
    bool init() { App_Parser = new Parser(); }
}

# parser.cpp
Parser *App_Parser = 0;

# worker.cpp
class Worker: public QThread {
    Worker(int thread_id , QObject *parent) {
        Parser::init ();
        connect ( App_Parser , .... , this , SLOT(parseCompleted()) );
    }
    private slots:
           void parseCompleted () { 
                qDebug() << "Thread ID: " << thread_id << " completed"; 
           }
}

所以这就解决了问题,如果我在更高级别创建12工作者,我有时会看到无效的thread_id,并且它总是只有一个,在这种情况下,总是{{1 }}

如果我不使用App_Parser,只是使用13作为一个简单的实例,它就可以工作。

所以我在想这里为什么不应该使用全局变量。

1 个答案:

答案 0 :(得分:3)

阅读本文。它使Qt中的线程更加清晰:http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/

整个问题是关于QObject在哪里生活。当你创建新的Worker时,你在主线程中创建QThread,所以它的所有事件/信号也在主线程中解析。你误解了整个qt“线程事物”。