Seite 1 von 1

Problem mit Threading

Verfasst: 31. März 2006 16:59
von FBIagent
Moin,

vor ein par Tagen habe ich mit QT 4.1.0 begonnen(mit mingw).
Ich hatte mir ein Tool geschrieben mit GUI und wollte es neu schreiben.

Jetzt habe ich ein problem als ich multithreading einbauen wollte:

Code: Alles auswählen

 ./objapplication.o(.text+0x1033):application.cpp: undefined reference to `vtable for threadDnaa'
./objapplication.o(.text+0x1095):application.cpp: undefined reference to `vtable for threadDua'
./objapplication.o(.text+0x22e3):application.cpp: undefined reference to `vtable for threadDnaa'
./objapplication.o(.text+0x2345):application.cpp: undefined reference to `vtable for threadDua'

Ich weis nicht wirklich woran ich bei diesem Fehler bin.

Hier ein par code schnipsel mit denen ihr mir hoffentlich weiterhelfen könnt:

Code: Alles auswählen

//// application.h ////
class application : public QWidget
{
Q_OBJECT
public:
  application(QWidget* parent=0);
protected slots:
  void buttonDnaaClicked();
  void buttonDuaClicked();
  void shoutdown();
private:
  int startCheck;
  bool dnaaStarted,duaStarted;
  deleteNotActivatedAccounts *dnaa;
  deleteUnusedAccounts *dua;
  threadDnaa *dnaaThread;
  threadDua *duaThread;
  QLabel *labelDnaa,*labelDua;
  QPushButton *buttonDnaa,*buttonDua,*buttonExit;
};

//// application.cpp ////
application::application(QWidget* parent) : QWidget(parent)
{
  dnaa = new deleteNotActivatedAccounts();
  dua = new deleteUnusedAccounts();
  dnaaThread = new threadDnaa;
  duaThread = new threadDua;

  dnaaThread->dnaa = dnaa;
  duaThread->dua = dua;
  dnaaStarted = false;
  duaStarted = false;
...
void application::buttonDnaaClicked()
{
  if(dnaaStarted==false)
  {
    startCheck = dnaa->checkDependence();

    if(startCheck==1)
      QMessageBox::critical(this,"Start service","Error: Could not find config.txt file!");
    else if(startCheck==2)
      QMessageBox::critical(this,"Start service","Error: Could not connect to MySQL server.nCheck your config.");
    else
    {
      dnaaThread->start();
      dnaaStarted=true;
      buttonDnaa->setText("Stop");
    }
  }
  else
  {
    dnaa->exit = true;
    dnaaThread->wait();
    dnaaStarted = false;
...
void application::buttonDuaClicked()
{
  if(duaStarted==false)
  {
    startCheck = dua->checkDependence();

    if(startCheck==1)
      QMessageBox::critical(this,"Start service","Error: Could not find config.txt file!");
    else if(startCheck==2)
      QMessageBox::critical(this,"Start service","Error: Could not connect to MySQL server.nCheck your config.");
    else
    {
      duaThread->start();
      duaStarted=true;
      buttonDua->setText("Stop");
    }
  }
  else
  {
    dua->exit = true;
    duaThread->wait();
    duaStarted = false;
...
//// threadDnaa.h ////
class threadDnaa : public QThread
{
public:
  deleteNotActivatedAccounts *dnaa;
  virtual void run();
};

//// threadDnaa.cpp ////
void threadDnaa::run()
{
  dnaa->start();
}

//// threadDua.h ////
class threadDua : public QThread
{
public:
  deleteUnusedAccounts *dua;
  virtual void run();
};

//// tthreadDua.cpp ////
void threadDua::run()
{
  dua->start();
}
THX im Vorraus
MFG FBIagent[/code]

Verfasst: 31. März 2006 17:12
von BartSimpson
haste in der .pro Datei gesagt, das du ein Threadprogramm hast?
mit CONFIG += thread

Verfasst: 31. März 2006 17:45
von FBIagent
Hatte ich nicht drin. Habe es rein getan.

Projektdatei sieht folgendermaßen aus:

Code: Alles auswählen

TEMPLATE = app
TARGET = L2JWemaToolsV0.9
DEPENDPATH += .
INCLUDEPATH += .

CONFIG += qt thread warn_on
CONFIG += thread

# Input
HEADERS += application.h \
           config.h \
           dnaa.h \
           dua.h \
           extraString.h \
           extraTime.h \
           fileIO.h \
           mysqlConnection.h
SOURCES += application.cpp \
           config.cpp \
           dnaa.cpp \
           dua.cpp \
           extraString.cpp \
           extraTime.cpp \
           fileIO.cpp \
           L2JWemaToolsV0.9.cpp \
           mysqlConnection.cpp

MOC_DIR = moc
OBJECTS_DIR = obj
Neue makefiles erstellt mit

Code: Alles auswählen

qmake -o Makefile L2JWemaToolsV0.9.pro
und mit

Code: Alles auswählen

mingw32-make -f Makefile.Release
versucht zu kompilieren immer noch das gleiche Resultat.

Kann es sein das ich in

Code: Alles auswählen

class threadDnaa : public QThread
class threadDua : public QThread
auch so etwas wie

Code: Alles auswählen

Q_Object
reinschreiben muss wie ich es bei

Code: Alles auswählen

class application : public QWidget
machen musste wegen den slots?

Verfasst: 31. März 2006 17:52
von BartSimpson
Laut Doku sollte das rein.

Verfasst: 31. März 2006 20:41
von FBIagent
Na wie dumm man manchmal sein kann. In der Projektdatei von Qt war

Code: Alles auswählen

threadDnaa.cpp
threadDua.cpp
threadDnaa.h
threadDua.h
nicht angegeben :oops:

THX trotzdem.
MFG FBIagent

Verfasst: 31. März 2006 22:28
von stefan-tiger
OT: die es gibt schon neuere Versionen von Qt

Verfasst: 2. April 2006 18:36
von Spielgrips
>> Darauf achten, das man seine class auslagert und wenn ausgelagert mit #ifndef so macht das sie nur 1x definiert ist, das der moc compiler drüberfahren kann und nicht verwirrt ist!!