Я сделаю код простым, чтобы вы, ребята, могли видеть, что я пытаюсь сделать;) Я знаю обо всех проблемах блокировки и т. Д. Я пытаюсь выяснить, как сигналы и слоты играют с потоками.
В 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» для этого?
Заранее спасибо!