Как использовать потоки для создания нескольких приложений QApplication

Я нашел решение, позволяющее предотвратить блокировку основного потока app.exec() здесь.

Я попытался реализовать это, но получил следующие ошибки:

WARNING: QApplication was not created in the main() thread.
QWidget: Cannot create a QWidget without QApplication

Вот мой код:

PB — это класс со статической функцией, которая инициализирует графический интерфейс.

пб.cpp:

bool PB::Init(int argc, char *argv[],
        int ID) {

    QApplication app(argc, argv);
    PB PB(ID); // The constructor creates an instance of the pushbutton qt object
    app.exec();
    return true; // Do I even need this because app.exec() runs an infinite loop right?

}

основной.cpp:

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

    std::thread first(&PB::Init, argc, argv, 0);
    std::thread second(&PB::Init, argc, argv, 1);

    first.join();
    second.join();

}

Дело в том, что я инициализирую QApplication в классах, поэтому он должен работать... Я убедился, что он будет работать с отдельным тестом, где QApplication не используется в основном:

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

    PB::Init(argc, argv, 0);

}

Этот код работает нормально. Так что только когда я добавляю поток, я получаю эту ошибку.


person jlcv    schedule 24.04.2015    source источник
comment
Как вы думаете, зачем вам нужно два QApplications? QEventLoop или QThread::exec() обеспечивают цикл событий, если это то, что вам нужно.   -  person Vincas Dargis    schedule 24.04.2015
comment
Разве мне не нужен QApplication только для создания QWidget? Когда я удаляю QApplications, я получаю ошибку QWidget: Must construct a QApplication before a QWidget.   -  person jlcv    schedule 24.04.2015
comment
Извините, но виджеты Qt не поддерживают многозаголовок. QWidget должен быть создан в одном (основном) потоке, где находится QApplication. Используйте потоки для вычисления данных и передачи результатов с помощью сигналов Qt::QueuedConnection в основной поток для визуализации в графическом интерфейсе. Посмотрите пример Мандельброта с многопоточностью о main (GUI) и связь рабочего потока.   -  person Vincas Dargis    schedule 24.04.2015


Ответы (1)


Вы можете создать QApplication в другом потоке, но вы должны создать все объекты класса GUI в этом потоке, иначе вы получите неопределенное поведение. QApplication является одноэлементным, поэтому вы не можете создавать несколько экземпляров QApplication в разных потоках.

person gomons    schedule 24.04.2015
comment
Один момент: нет такого понятия, как основной поток. Можно смело создавать QApplication в неосновной теме и не будет УБ. Но вы правы, это QApplication синглтон. У @Justin есть проблема, когда он создает второй экземпляр QApplication. Это не зависит от потоков. Пожалуйста, исправьте ответ. - person Dmitry Sazonov; 24.04.2015
comment
@SaZ, спасибо, я исправил. Вы можете редактировать мой английский (= - person gomons; 24.04.2015