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

Alles rund um die Programmierung mit Qt
Antworten
marwar_cottbus
Beiträge: 8
Registriert: 7. Juli 2008 10:48
Wohnort: cottbus (zur Zeit noch)

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

Beitrag 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?
marwar_cottbus
Beiträge: 8
Registriert: 7. Juli 2008 10:48
Wohnort: cottbus (zur Zeit noch)

Beitrag von marwar_cottbus »

Hat sich erledigt, es muss eine QCoreApplication und keine QApplication sein, da ich keine GUI habe.
Antworten