[QT4][QThread] błąd przy tworzeniu obiektu QThread

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
patlas
Sędziwy Jeż
Sędziwy Jeż
Posty: 42
Rejestracja: 23 maja 2008, 10:53
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

[QT4][QThread] błąd przy tworzeniu obiektu QThread

Post autor: patlas »

Witam :)

W pliku widget.h pod klasą wygenerowaną przez qt dodaje nową klase:

Kod: Zaznacz cały

.....

class ThreadReceive: public QThread
{
public:
    void run();
    ThreadReceive();

};
Następnie w widget.cpp dodaję:

Kod: Zaznacz cały

...
void ThreadReceive::run()
{
    char x = 0xAA;
    emit received(x);
}
kolejno w widget.h w klasie widget (wygenerowanej przez creatora) tworze obiekt klasy ThreeadReceive:

Kod: Zaznacz cały

ThreadReceive thread;
Po czym podczas kompilacji dostaje następujący błąd:

ThreadReceive does not name a type

a jeżeli stworze obiekt tak (tzn wskaźnik):

Kod: Zaznacz cały

ThreadReceive *thread;
to otrzymuje takie błędy:
1:ISO C++ forbids declaration of ThreadReceive with no type
2:expected ';' before '*' token


Oczywiście błędy w obu przypadkach dotyczą lini w której znajduja się ThreadReceive thread / *thread

Co robie źle :?:
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: [QT4][QThread] problem z utworzeniem obiektu QThread

Post autor: beluosus »

W momencie deklaracji obiektu "thread" kompilator nie zna klasy "ThreadReceive". Zainkluduj odpowiedni nagłówek w tym pliku. BTW każdą klasę powinno się umieszczać w osobnym pliku, a coś przeczucie mi mówi, że klasa ThreadReceive jest niżej usytuowana niż klasa w której definiujesz ów obiekt.
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
Awatar użytkownika
ka_o_3991
Przyjaciel
Przyjaciel
Posty: 864
Rejestracja: 01 wrz 2007, 13:34
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86_64

Odp: [QT4][QThread] problem z utworzeniem obiektu QThread

Post autor: ka_o_3991 »

Zmień tytuł tematu na zgodny z REGULAMINEM
Zwróć uwagę głównie na słowa, których używasz
Tytuł tematu zmienisz edytując pierwszy post
W razie wątpliwości/zastrzeżeń odnośnie powyższej informacji skontaktuj się z moderatorem, który ją wstawił.
patlas
Sędziwy Jeż
Sędziwy Jeż
Posty: 42
Rejestracja: 23 maja 2008, 10:53
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: [QT4][QThread] błąd przy tworzeniu obiektu QThread

Post autor: patlas »

Dziękuje za odpowiedź :)

Mam jeszcze jeden problem.
Mianowicie tworze wątek i ładnie działa ale w momencie gdy dodam makro (jeśli tak to się nazywa) Q_OBJECT w pliku nagłówkowym to kompilator wywala następujący błąd:
Undefined reference to 'vtable for ThreadReceive' (ThreadReceive to mój wątek QThread)

Tak wygląda plik nagłówkowy:

Kod: Zaznacz cały

#ifndef THREADRECEIVE_H
#define THREADRECEIVE_H

#include <QThread>
#include <QObject>
#include "rs232.h"

class ThreadReceive : public QThread
{
    Q_OBJECT      ////////////// w tym miejcu wyrzuca błąd 

public:

    ThreadReceive();
    void run();

};

#endif // THREADRECEIVE_H
skoczo
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 176
Rejestracja: 09 kwie 2008, 11:40
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: [QT4][QThread] błąd przy tworzeniu obiektu QThread

Post autor: skoczo »

Spróbuj zmienić konfigurację budowania (jeśli używasz Qt-Creator) i dodaj destruktor. Konstruktor i destruktor muszą być zdefiniowane. Ja też miałem takie błędy i to mi pomogło.
Moja strona: http://www.skoczo.pl
A na niej:
- programy w QT i GTK
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: [QT4][QThread] błąd przy tworzeniu obiektu QThread

Post autor: beluosus »

Musisz uruchomić

Kod: Zaznacz cały

qmake projekt.pro
aby Makefile tworzył pliki "moc".

EDIT:
PS
@skoczo: z tym destruktorem to raczej przypadek, pewnie przy okazji uruchomiłeś qmake.
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
patlas
Sędziwy Jeż
Sędziwy Jeż
Posty: 42
Rejestracja: 23 maja 2008, 10:53
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: [QT4][QThread] błąd przy tworzeniu obiektu QThread

Post autor: patlas »

Bardzo dziękuje za pomoc, faktycznie qmake wystarczyło :)

Korzystając z założonego tematu mam jeszcze jedno pytanie odnośnie wątku:

Wątek odpowiedzialny ma być za ciągłe odbieranie danych z RS232 (jeśli się w ogóle pojawią), na samym początku klasy Widget.h (klasy głównej) tworze nowy opiekt QThread (mój wątek):

Kod: Zaznacz cały

Thread *t;
następnie w pliku Wiget.cpp robie start wątku t

Kod: Zaznacz cały

t = new Thread();
t->start();
Co w tym momencie robi wątek :?: Bo w Thread::run() mam napisaną pętelke z odczytem i emitowanym sygnałem jeśli coś zostanie odczytane ale niestety dane są wysyłane a wątek chyba ich nie odbiera. Co robie źle z w/w wątkiem :?:

P.S Przepraszam za zapewne głupie pytanie ale jestem początkującym użytkownikiem wątków i nie daje sobie z nimi rady :(
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: [QT4][QThread] błąd przy tworzeniu obiektu QThread

Post autor: beluosus »

RTFM. :)

Kod: Zaznacz cały

void QThread::start ( Priority priority = InheritPriority )   [slot]
Begins execution of the thread by calling run(), which should be reimplemented in a QThread subclass to contain your code.
start() uruchamia run() z odpowiednim priorytetem. Jak dla mnie to oczywiste ale: dla testu w run() zrób pętlę która będzie wypisywała coś na terminalu i czekała np 1s (sleep). Wtedy okaże się czy źle odczytujesz dane z RS czy błąd leży gdzie indziej. BTW, nie zapomnij o "delete t;".
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
patlas
Sędziwy Jeż
Sędziwy Jeż
Posty: 42
Rejestracja: 23 maja 2008, 10:53
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: [QT4][QThread] błąd przy tworzeniu obiektu QThread

Post autor: patlas »

Wpisałem mu pętle z qDebug i wyświetliło to co miało wyświetlić :)
W takim razie problem wygląda w emisji sygnału :)
Emitowany ma być buffor char Buff[10];
więc napisałem takiego emita:

Kod: Zaznacz cały

signals:
 DataReceived(char*);
P.S Sygnał jest emitowany tylko nie z takimi wartościami jakie trzeba, dopiero gdy zamiast buffora wstawie cos takiego:

Kod: Zaznacz cały

 char *buffer = "patlas"; 
 emit DataReceived(buffer);
W takim razie jak ma wyglądać emit aby emitować tablice :?:

Z góry dziękuje za pomoc :)
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 27 gości