Utrzymam kod prosty, abyście mogli zobaczyć, co próbuję zrobić;) Jestem świadomy wszystkich problemów z blokowaniem itp. Próbuję dowiedzieć się, jak sygnały i gniazda grają z wątkami.Używanie Qt tam, gdzie wątek roboczy tworzy nowe elementy GUI
W 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();
}
Załóżmy, że sygnały i gniazda zostały prawidłowo skonfigurować w plikach nagłówkowych (Przetestowałem i są). Teraz tutaj jest problem:
W 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
}
Pytanie: Ponieważ obiekt MyReceiver powstał w main(), która znajduje się na głównym wątku, to znaczy, że szczeliny (np. gotit()) będzie działał na głównym wątku i dlatego jest bezpieczny do robienia rzeczy GUI? Nawet w przypadkach, gdy sygnał został podniesiony z innego QThread (np. MyConsole w tym przykładzie)?
Czy istnieje lepszy sposób na umożliwienie wątkom pracowniczym interakcji z GUI (na przykład, Obj-C/Cocoa ma podejście typu "Wyślij wiadomość na głównym wątku"). Co to jest "sposób Qt" tego?
Z góry dziękuję!
Czy http://stackoverflow.com/questions/638251/how-to-emit-cross-thread-signal-in-qt odpowiada na pytanie? –