Problem mit Threading

Alles rund um die Programmierung mit Qt
Antworten
FBIagent
Beiträge: 3
Registriert: 31. März 2006 16:45
Kontaktdaten:

Problem mit Threading

Beitrag 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]
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

haste in der .pro Datei gesagt, das du ein Threadprogramm hast?
mit CONFIG += thread
FBIagent
Beiträge: 3
Registriert: 31. März 2006 16:45
Kontaktdaten:

Beitrag 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?
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Laut Doku sollte das rein.
FBIagent
Beiträge: 3
Registriert: 31. März 2006 16:45
Kontaktdaten:

Beitrag 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
stefan-tiger
Beiträge: 49
Registriert: 28. März 2006 22:52

Beitrag von stefan-tiger »

OT: die es gibt schon neuere Versionen von Qt
Spielgrips
Beiträge: 51
Registriert: 8. März 2006 23:09
Kontaktdaten:

Beitrag 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!!
Antworten