Использование Qt, где рабочий поток создает новые элементы GUI - PullRequest
5 голосов
/ 27 августа 2011

Я сделаю код простым, чтобы вы, ребята, могли видеть, что я пытаюсь сделать;) Я знаю обо всех проблемах блокировки и т. Д. Я пытаюсь выяснить, как сигналы и слоты играют с потоками.

В main.cpp:

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    MyConsole c;       // Subclasses QThread and implements run()
    MyReceiver r(app); // We pass app to MyReceiver for later (see below)
    QObject::connect(&c, SIGNAL(sendit()),
                     &r, SLOT(gotit()));
    c.start();         // Start the worker thread
    app.exec();
}

Предположим, что сигналы и слоты были правильно настроены в заголовочных файлах (я проверял и они есть).Теперь вот проблема:

В MyReceiver.cpp:

void MyReceiver::gotit()
{
    QLabel *label = new QLabel(0, "Hello");  // Some GUI element, any will do
    app.setMainWidget(*label);               // Some GUI action, any will do
}

Вопрос в том, что объект MyReceiver, созданный в main (), который находится в главном потоке, делает этоОзначает ли это, что слоты (например, gotit ()) будут работать в главном потоке и поэтому безопасны для работы с графическим интерфейсом?Даже в тех случаях, когда сигнал был получен из другого QThread (например, MyConsole в этом примере)?

Есть ли лучший способ разрешить рабочим потокам взаимодействовать с GUI (например, Obj-C / Cocoa имеюттип подхода «отправить сообщение в основную ветку»).Что такое «путь Qt» для этого?

Заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 27 августа 2011

По умолчанию (Qt :: AutoConnection) слоты будут запускаться в потоке, в котором был создан QObject. Таким образом, независимо от того, из какого потока вы посылаете сигнал, слот будет всегда выполняться в потоке, QObject "живет"in (если в этом потоке выполняется цикл событий Qt, иначе событие не может быть доставлено).Поскольку основной поток станет потоком Qt GUI, он будет работать как положено.Это действительно способ взаимодействия Qt с GUI.Смотрите также: http://doc.qt.nokia.com/4.7/thread-basics.html (ищите сходство потоков).

2 голосов
/ 27 августа 2011

"Способ Qt" для передачи сигнала из одного потока и получения его в другом потоке состоит в использовании соединения с очередями

connect( obj, SIGNAL(foo()), other_obj, SLOT(bar()), Qt::QueuedConnection )

Из документации Qt для Qt :: QueuedConnection:

Слот вызывается, когда управление возвращается в цикл обработки событий получателя. Слот выполнен в потоке получателя.

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