Habe folgendes Problem.
Besitze mehrere Threads(bis zu 50) jeder dieser thread erzeugt ein Objekt einer Klasse und geht dann in den EventLoop um auf ein Signal von dieser Klasse zu warten. Wenn das Signal kommt wird in einem Zeitintervall eine Methode der erstellten Klasse gestartet und wieder auf das Signal gewartet das ist die Grundfunktion der Threads.
Nun zum sicheren beenden. Aus irgendwelchen Gründen Funkioniert das Beenden nicht.
Folgende Vorgehensweise: ich Setze von Auserhalb eine Boolean und im Thread prüfe ich auf den Warheitswert dessen. Trifft der Boolean zu beende ich den EventLoop mit this->quit oder this->exit(0). Nun müsste ja der Thread selbstständig ein finished() Signal emitieren wenn der EventLoop beendet worden ist und kann dann von Auserhalb mit thread->deleteLater reagieren..
Das selstsame ist von beispielsweise 5 Threads senden 3 bis 4 ein finished Signal und der Rest macht nix -.-
Oder habe ich in meinem System einen Denkfehler eingebaut?
Nun ein wenig Code
Thread:
Code: Alles auswählen
void SearchVehicle::run() {
connectTimeIntervall = 6;
disconnectTimeIntervall = 4;
isRequestClose = false;
connectToFtp = new ConnectFtp();
initSignalSlot();
connectToFtp->startConnect();
exec();
}
void SearchVehicle::initSignalSlot(){
qRegisterMetaType<QList<QUrlInfo> > ("QList<QUrlInfo>");
connect(connectToFtp, SIGNAL(readyToAction(QList<QUrlInfo>, QList<QUrlInfo>)), this, SLOT(addVehicleFileInfo(QList<QUrlInfo>)));
}
SearchVehicle::SearchVehicle(){
this->moveToThread(this);
}
void SearchVehicle::addVehicleFileInfo(QList<QUrlInfo> fileInfoList) {
//MACHT WAS..
searchFinish();
}
void SearchVehicle::requestClose(){
mutex.lock
isRequestClose = true;
mutex.unlock
}
void SearchVehicle::startSearch() {
connectToFtp = new ConnectFtp();
initSignalSlot();
connectToFtp->setSettings(ftpSettings);
connectToFtp->startConnect();
}
void SearchVehicle::searchFinish() {
mutex.lock
if(isRequestClose){
mutex.unlock
qDebug() << "beendet gesendet " << currentVehicle->getVehicleName();
this->exit(0);
return;
}else{
emit finish(currentVehicle);
if(currentVehicle->getConnectStatus()){
this->sleep(connectTimeIntervall);
startSearch();
}else{
mutex.unlock
this->sleep(disconnectTimeIntervall);
startSearch();
}
}
}
Übergeordnete Klasse zum beenden..
Code: Alles auswählen
void VehicleFileList::requestCloseProgress(){
currentCloseThreadCount = 0;
isCloseProgress = true;
for(int i=0; i < threadList.length(); i++){
connect(threadList[i], SIGNAL(finished()), this, SLOT(threadCloseSlot()));
threadList[i]->requestClose();
}
}
void VehicleFileList::threadCloseSlot(){
mutex.lock();
currentCloseThreadCount++;
qDebug() << currentCloseThreadCount;
mutex.unlock();
if(threadList.length() > 0){
qDeleteAll(threadList.begin(), threadList.end());
}
emit closeFinish();
return;
}
}