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.


  • Moderators

    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 :)


  • Moderators

    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. :)


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.