QThread in einer DLL ohne GUI aus Nicht-QT-Umgebung nutzen
Verfasst: 7. Juli 2008 12:43
Hallo!
Ich wollte QThread in einer DLL nutzen ohne im Hauptprogramm auf QT zuzugreifen. Nachdem ich beim Verlassen des Eventloops die Fehlermeldung bekommen habe, dass QEventloop QApplication benötigt, suche ich nach einer Möglichkeit mit minimalen Änderungen QApplication in die DLL einzubauen.
Jetzt kriege ich diese Fehlermeldung:
Prozedureinsprungpunkt "??0QApplication@@QAE@AAHPAPADH@Z" wurde in der DLL "QtGui4.dll" nicht gefunden.
Im Augenblick sieht es so aus:
header:
cpp:
bewert_verteiler wird in einer anderen Klasse angelegt und über bewert_verteiler::abwarten() ausgelöst.
diese andere Klasse übergibt einen Pointer QApplication* app, der wie folgt erzeugt wurde:
Konstruktor:
Destruktor:
Wo liegt mein Fehler?
Ich wollte QThread in einer DLL nutzen ohne im Hauptprogramm auf QT zuzugreifen. Nachdem ich beim Verlassen des Eventloops die Fehlermeldung bekommen habe, dass QEventloop QApplication benötigt, suche ich nach einer Möglichkeit mit minimalen Änderungen QApplication in die DLL einzubauen.
Jetzt kriege ich diese Fehlermeldung:
Prozedureinsprungpunkt "??0QApplication@@QAE@AAHPAPADH@Z" wurde in der DLL "QtGui4.dll" nicht gefunden.
Im Augenblick sieht es so aus:
header:
Code: Alles auswählen
#pragma once
#include <QThread>
#include "genet_opti.h"
#include "Table.h"
class sub_bewert_st : public QThread
{
Q_OBJECT
public:
QObject* parent;
int index_start,index_stop;
int bewert_start();
sub_bewert_st(QObject* parent,...);
void run();
};
class bewert_verteiler: public QThread{
public:
QObject* parent;
sub_bewert_st** thread_handels;
int thread_anz;
bewert_verteiler(QObject* parent,...,const int thread_anz=2);
int threads_aktivieren();
void run();
int abwarten();
~bewert_verteiler();
};
Code: Alles auswählen
sub_bewert_st::sub_bewert_st(QObject* parent,...,const int _index_start,const int _index_stop):QThread(parent){
...
index_start=_index_start;
index_stop=_index_stop;
}
void sub_bewert_st::run(){
connect( this, SIGNAL(finished()),
this, SLOT(deleteLater()), Qt::QueuedConnection);
bewert_start();
exec();
}
int sub_bewert_st::bewert_start(){
for(int lauf_p=index_start;lauf_p<min(pop_size,index_stop);lauf_p++){
...
}//for lauf_p
return 0;
}
bewert_verteiler::bewert_verteiler(QObject* parent,...,
const int _thread_anz):QThread(parent)
{
thread_anz=_thread_anz;
thread_handels=new sub_bewert_st*[thread_anz];
...
//init, soweit notwendig
int popsize=pop_size;
int anz_pro_thread=div(popsize,thread_anz).quot;
for (int lauf=0;lauf<thread_anz;lauf++){
int grenze_unten=(lauf*anz_pro_thread);
int grenze_oben=((lauf+1)*anz_pro_thread)-1;
if ((lauf+1)==thread_anz){
grenze_oben =popsize -1;
}
thread_handels[lauf]=new sub_bewert_st(this,...,grenze_unten,grenze_oben);
//thread_handels[lauf]->start();
}
//init fertig
//app.exec();
}
int bewert_verteiler::threads_aktivieren(){
//berechnung fertig
for (int lauf =0;lauf<thread_anz;lauf++){
thread_handels[lauf]->start();
}
//prüfen auf fertig
int warten=1;
while (warten==1){
sleep(30);
warten=0;
for(int lauf =0;lauf<thread_anz;lauf++){
if(thread_handels[lauf]->isFinished()==false){
warten=1;
}
}
}
//ende
for (int lauf =0;lauf<thread_anz;lauf++){
thread_handels[lauf]->quit();
}
return 0;
}
void bewert_verteiler::run(){
connect( this, SIGNAL(finished()),
this, SLOT(deleteLater()), Qt::QueuedConnection);
threads_aktivieren();
exec();
}
int bewert_verteiler::abwarten(){
start();
int warten=1;
while (warten==1){
sleep(30);
warten=0;
for(int lauf =0;lauf<thread_anz;lauf++){
if(thread_handels[lauf]->isFinished()==false){
warten=1;
}
}
}
return 0;
}
bewert_verteiler::~bewert_verteiler()
{
for (int lauf =0;lauf<thread_anz;lauf++){
delete ...[lauf];
}
delete thread_handels;
}
diese andere Klasse übergibt einen Pointer QApplication* app, der wie folgt erzeugt wurde:
Konstruktor:
Code: Alles auswählen
int argc =0;
app = new QApplication(argc,NULL);//im headerfile public definiert
app->exec();
Code: Alles auswählen
app->quit();