2 klasy a wątki
-
Witam, chciałbym zrobić w qt wątki, i wszystko jest dobrze, ale jak chcę uruchomić funkcję testowa_funkcja() w wątku void MyThread::run() to wyskakuje że 'testowa_funkcja' was not declared in this scope. Problem jest w tym, że funkcja testowa_funkcja() musi być w dialog.cpp, a w mythread.cpp chciałbym ją tylko uruchomić.
Tutaj kod :
"dialog.h":http://wklej.to/e68D5
"mythread.h":http://wklej.to/s1XAh
"main.cpp":http://wklej.to/Ds5jL
"dialog.cpp":http://wklej.to/fQ6Yq
"mythread.cpp":http://wklej.to/htu1E -
@connect(mThread, SIGNAL(NumberChanged(int)), this, SLOT(testowa_funkcja()));@
Sygnał ma parametr int
NumberChanged(int)Slot tez musi przyjąć int'a
-
Dalej to samo,
błąd: 'testowa_funkcja' was not declared in this scope
testowa_funkcja(i);
^ -
Jeśli chcesz aby ci to zadziałało to daj do slota
testowa_funkcja
parametr int tak jak ci pisał savior, oraz tak jak masz w slocieonNumberChanged
. -
A nie lepiej używać moveToThread(), tak jak polecają w dokumentacji? Tym sposobem dużo łatwiej zarządzać projektem.
Tutaj funkcja nie działa i nie dziwne. Cały design jest - sorry - naciągany. Funkcja "testowa_funkcja" jest w dialog.h i to zadeklarowana jako prywatna. W MyThread ani nie załączasz tego nagłówka, ani nie informujesz kompilatora, z jakiej klasy ona pochodzi.
Przerób Dialog na singleton: rozwiązanie bardzo proste, ale - moim zdaniem - wyrabia bardzo złe nawyki w programowaniu. Druga, dużo lepsza opcja to zadeklarowanie sygnału w twoim wątku, np. runFunkcjaTestowa() i podpięcie go do dialogu i jego funkcji za pomocą connect(), najlepiej jako Qt::QueuedConnection - wtedy unikasz wszelkich problemów z komunikacją między wątkami.
-
Dopiero zaczynam naukę z qt i stąd te wszystkie problemy. Chciałbym przeczytać dokumentację, ale problemem jest mój angielski :)
-
OK, to w skrócie: QThread nie jest sam w sobie wątkiem. To zwykła klasa jak każda inna, działa sobie w głównym wątku, tym samym, co reszta programu. Tylko to, co odpalasz w funkcji run() jest wykonywane w innym wątku. Dość skomplikowane. Dlatego poleca się przenosić do wątku oddzielny obiekt (jakaś pochodna QObject) i odpalać go tam. "Link":http://qt-project.org/doc/qt-4.8/qthread.html.
Co do początkowania: polecam dobrać się do jakiejś książki o Qt, jest ich trochę. Ale po angielsku ;) No właśnie, co do "problemem jest mój angielski"... jak chcesz programować, musisz dobrze znać angielski i tyle. Innej opcji nie ma.
-
Czyli, jeżeli bym przeniósł wszystko do pliku mythread.cpp i tam wykonywał kod w funkcji run i tylko dane bym przesyłał do funkcji testowa_funkcja() to by działało ?? Mi się wydaje, że chyba za szybko się rzuciłem na tego frameworka qt. Piszę aktualnie projekt do sprawdzania komputera (jakie ma podzespoły itd) i właśnie problem się zaczął jak chciałem pobierać plik z internetu, gdyż po rozpoczęciu pobierania okno główne programu zawiesiło się, dopóki pobieranie się nie zakończyło. Jak pisałem kiedyś na bibliotece WINAPI to wystarczyło tylko trzeba linijkami kodu utworzyć wątek i wszystko śmigało. :)