Почему я не могу использовать глобальную переменную в классе на основе QThread? - PullRequest
0 голосов
/ 07 октября 2011

Предположим, минимальный регистр, который содержит один класс с именем 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, и он всегда был только на один уровень выше, в данном случае всегда 13.

И если я не использую App_Parser, а просто использую new Parser() для простого экземпляра, он работает.

Так что я думаю о том, почему здесь не следует использовать глобальные переменные.

1 Ответ

3 голосов
/ 07 октября 2011

Прочтите это. Это делает использование потоков в Qt немного чище: http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/

Вся проблема в том, где живет QObject. Когда вы создаете новый Worker, вы создаете QThread в главном потоке, поэтому все его события / сигналы также анализируются в основном потоке. Вы неправильно поняли всю Qt "вещь вещь".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...