Problemchen mit QThreads
Verfasst: 24. März 2006 16:10
Hallo zusammen und ich bin neu hier und fange erst mit Qt an zu arbeiten,
aaaber ich habe schon Probleme wie die ganz großen *G*
Folgendes:
In meinem Programm muss eine Routine mehrere Slider (permanent steuern) und das GUI soll während dieser Zeit noch reagieren. Mit fork() will ich nicht arbeiten, da ich sharedmemory und signal verhindern will, also müssen threads her, die leider nicht nativ von C/C++ unterstützt werden, was ja eigentlich nicht sooo schlimm ist, weil es QThreads gibt. Doch leider wollen die nicht funktionieren. (Evtl ein newbee bug)
Ich hab folgendes System:
gcc: 3.4.4
qt: 3.3.4-r3
Muss man eigentlich beim kompilieren von gcc und qt Kompiler-flags angeben, damit qt Threads unterstüzt. Ich habe da mal so was gelesen, kann aber die Useflags nirgends finden (ich habe Gentoo, sollte ich evtl noch sagen)
Und gemacht habe ich das Gui mit dem designer und dann das Makefile mit qmake
Der Code sieht so aus:
Ich habe dann noch gelesen, das die Option:
-DQT_THREAD_SUPPORT
noch im Makefile mit angegeben werden muß. Das ist alles noch ok. Und wenn er dann die einzelnen Dateien kompiliert (in *.o) is alles noch ok, aber sobald er dann die Sachen zusammen linken will kackt er hab.
Ich versteh das nicht. Kann mir da evtl wer helfen? (Beim Linken die Kompilieroption mit angeben bringt nichts)
THX
Jürgen
aaaber ich habe schon Probleme wie die ganz großen *G*
Folgendes:
In meinem Programm muss eine Routine mehrere Slider (permanent steuern) und das GUI soll während dieser Zeit noch reagieren. Mit fork() will ich nicht arbeiten, da ich sharedmemory und signal verhindern will, also müssen threads her, die leider nicht nativ von C/C++ unterstützt werden, was ja eigentlich nicht sooo schlimm ist, weil es QThreads gibt. Doch leider wollen die nicht funktionieren. (Evtl ein newbee bug)
Ich hab folgendes System:
gcc: 3.4.4
qt: 3.3.4-r3
Muss man eigentlich beim kompilieren von gcc und qt Kompiler-flags angeben, damit qt Threads unterstüzt. Ich habe da mal so was gelesen, kann aber die Useflags nirgends finden (ich habe Gentoo, sollte ich evtl noch sagen)
Und gemacht habe ich das Gui mit dem designer und dann das Makefile mit qmake
Der Code sieht so aus:
Code: Alles auswählen
#include <qthread.h>
[...]
class MyThread : public QThread
{
public:
MyThread();
~MyThread();
void run();
void stop();
private:
bool stopped;
};
MyThread::MyThread()
{
this->stopped = false;
}
void MyThread::run()
{
while(this->stopped)
{
sleep(1);
printf("Ping!\n");
}
}
void MyThread::stop()
{
this->stopped = true;
}
MyThread mov;
[...]
void Form1::mov_test()
{
mov.start(QThread::NormalPriority);
}
-DQT_THREAD_SUPPORT
noch im Makefile mit angegeben werden muß. Das ist alles noch ok. Und wenn er dann die einzelnen Dateien kompiliert (in *.o) is alles noch ok, aber sobald er dann die Sachen zusammen linken will kackt er hab.
Code: Alles auswählen
/usr/qt/3/bin/uic dmxgui.ui -o dmxgui.h
g++ -c -pipe -Wall -W -O2 -mcpu=i686 -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -I/usr/qt/3/mkspecs/linux-g++ -I. -I. -I/usr/qt/3/include -o main.o main.cpp
main.cpp: In Funktion »void handler(int)«:
main.cpp:13: Warnung: unused parameter `int sig'
g++ -c -pipe -Wall -W -O2 -mcpu=i686 -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -I/usr/qt/3/mkspecs/linux-g++ -I. -I. -I/usr/qt/3/include -o sidmousegrabber.o sidmousegrabber.cpp
sidmousegrabber.cpp: In Memberfunktion »virtual void
SidMouseGrabber::mouseReleaseEvent(QMouseEvent*)«:
sidmousegrabber.cpp:57: Warnung: unused parameter `QMouseEvent*e'
/usr/qt/3/bin/uic dmxgui.ui -i dmxgui.h -o dmxgui.cpp
g++ -c -pipe -Wall -W -O2 -mcpu=i686 -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -I/usr/qt/3/mkspecs/linux-g++ -I. -I. -I/usr/qt/3/include -o dmxgui.o dmxgui.cpp
In file included from dmxgui.cpp:31:
dmxgui.ui.h: In Funktion »void signal_handler_IO(int)«:
dmxgui.ui.h:68: Warnung: unused parameter `int status'
/usr/qt/3/bin/moc sidmousegrabber.h -o moc_sidmousegrabber.cpp
g++ -c -pipe -Wall -W -O2 -mcpu=i686 -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -I/usr/qt/3/mkspecs/linux-g++ -I. -I. -I/usr/qt/3/include -o moc_sidmousegrabber.o moc_sidmousegrabber.cpp
/usr/qt/3/bin/moc dmxgui.h -o moc_dmxgui.cpp
g++ -c -pipe -Wall -W -O2 -mcpu=i686 -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -I/usr/qt/3/mkspecs/linux-g++ -I. -I. -I/usr/qt/3/include -o moc_dmxgui.o moc_dmxgui.cpp
g++ -o dmxgui main.o sidmousegrabber.o dmxgui.o moc_sidmousegrabber.o moc_dmxgui.o -L/usr/qt/3/lib -L/usr/X11R6/lib -lqt -lXext -lX11 -lm
dmxgui.o(.text+0x16): In function `MyThread::MyThread[not-in-charge]()':
: undefined reference to `vtable for MyThread'
dmxgui.o(.text+0x46): In function `MyThread::MyThread[in-charge]()':
: undefined reference to `vtable for MyThread'
dmxgui.o(.text+0xb83c): In function `__tcf_0':
: undefined reference to `MyThread::~MyThread [in-charge]()'
moc_dmxgui.o(.gnu.linkonce.r._ZTV5Form1+0x220): undefined reference to `Form1::MyThread()'
moc_dmxgui.o(.gnu.linkonce.r._ZTV5Form1+0x224): undefined reference to `Form1::run()'
moc_dmxgui.o(.gnu.linkonce.r._ZTV5Form1+0x228): undefined reference to `Form1::stop()'
collect2: ld returned 1 exit status
make: *** [dmxgui] Fehler 1
THX
Jürgen