Seite 1 von 1

QThread in einer DLL ohne GUI aus Nicht-QT-Umgebung nutzen

Verfasst: 7. Juli 2008 12:43
von marwar_cottbus
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:

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();
};
cpp:

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;

}
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:

Code: Alles auswählen

int argc =0;
app = new QApplication(argc,NULL);//im headerfile public definiert
app->exec();
Destruktor:

Code: Alles auswählen

app->quit();
Wo liegt mein Fehler?

Verfasst: 8. Juli 2008 09:03
von marwar_cottbus
Hat sich erledigt, es muss eine QCoreApplication und keine QApplication sein, da ich keine GUI habe.