Threads in QT



  • Hallo!

    Also ich habe im Moment so eine Art Blackout... Ich lerne im Moment QT und komme damit auch recht gut vorran, nur habe ich gerade ein Problem, für dass ich dringend diese Threads bräuchte. Und zwar lese ich die gesammte Verzeichnisstruktur eines PC's aus, was so um die 2 Minuten dauert. Während dessen ist das Programm komplett nicht ansprechbar. Nun habe ich etwas gelesen und habe herausgefunden, dass Threads für so etwas benutzt werden können. Am liebsten wäre mir natürlich, wenn während des Auslesens der Ladebalken sich von 0% bis 10% bewegen würde (der Ladebalken zeigt nicht nur das Auslesen der Verzeichnisstruktur an, deswegen nur bis 10%)... Nun stehe ich etwas auf dem Schlauch, weil ich irgendwie keine Ahnung habe, wie ich diese Thread jetzt verwenden soll! Ich poste hier mal meinen Code, der für das Auslesen etc. zuständig ist und ich würde mich sehr freuen, wenn ihr mir da einen kleine Denkanstoß geben könntet! Danke schonmal im Voraus! 🙂
    Jonathan

    void readout::increaseline()
    {
        int currentvalue = progressBar->value();
        QString filename = "configuration.txt";
        int steps = 100;
        int factor = 100/steps;
        int writeout = currentvalue+factor;
        switch(writeout)
        {
        	case 1:
        	{
        		label_3->setText("Setting up configuration File...");
        		QFile file( filename ); // Initialising file to write to
    			time_t timestamp;
    			tm *now;
    			timestamp = time(0);
    			now = localtime(&timestamp);
    			if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
    			{
    				return;
    			}
    			QTextStream out(&file);
    			out << "[[[[[SECTION=CONFIGINFO]]]]]\n";
    			out << "Configurationfile build by GSI (Get System Information)\n" <<
    							"Build Date: " << now->tm_mday << "." << now->tm_mon+1 << "."
    							<< now->tm_year+1900 << "\n" << 
    							"Build Time: " << now->tm_hour << "." << now->tm_min;
    			out << "[[[[[ENDSECTION]]]]]";
        	}
        	break;
    
        	case 2:
        	{
        		label_3->setText("Getting basic OS information...");
        		QFile file( filename );
    			if (!file.open(QIODevice::Append | QIODevice::Text))
    			{
    				return;
    			}
    			QTextStream out(&file);
    			out << "\n\n[[[[[SECTION=OSINFO]]]]]\n";
    			out << "Operating System: This part isn't finished right now!\n";
    			out << "Version: This part isn't finished right now!\n";
    			out << "Desktop: This part isn't finished right now!\n";
    			out << "[[[[[ENDSECTION]]]]]";
        	}
    
        	case 3:
        	{
        		label_3->setText("Readout Directory Structure...");
        		qint64 size;
        		QString outsize;
        		QString temp;
    			QFile file( filename );
    			if (!file.open(QIODevice::Append | QIODevice::Text))
    			{
    				return;
    			}
    			QTextStream out(&file);
    			out << "\n\n[[[[[SECTION=DIRANDFILES]]]]]\n";
    			QDirIterator it("/", QDirIterator::Subdirectories);
    			while (it.hasNext()) {
    				temp = it.next();
    				if((temp.endsWith("/..")==false) && (temp.endsWith("/.")==false))
    				{
    					QFileInfo info1(temp);
    					size = info1.size();
    					if(size<1024)
    					{
    						outsize = tr("%1 Byte").arg(size);
    					} else	if(size<1048576) {
    						outsize = tr("%1 Kilobyte").arg(size/1024);
    					} else if(size<1073841824) {
    						outsize = tr("%1 Megabyte").arg(size/1024/1024);
    					} else {
    						outsize = tr("%1 Gigabyte").arg(size/1024/1024/1024);
    					}
    					out << temp << " ----- " << outsize << "\n";
    				}
    			}
    			out << "[[[[[ENDSECTION]]]]]";
        	}	
    		break;
    
        	case 4:
        	{
        			label_3->setText("Readout xorg.conf...");
        	}
        	break;
    
        	case 5:
        	{	
        		label_3->setText("Readout systemconf...");
        	}
        	break;
        }
        progressBar->setValue(writeout);
        QTimer::singleShot(100, this, SLOT(increaseline()));
    }
    

    Ich weiß natürlich, dass dieser Code alles andere als schön ist, aber er funktioniert. Außerdem lerne ich, auch wenn der Code nicht der beste ist, an sich schon durch das schreiben von kleinen Beispielprogrammen, wie das so alles funktioniert und wie QT verwendet wird...



  • Welches Betriebssystem verwendest du?

    Threads sind nämlich normalerweise eine Betriebssystemabhängige Sache, außer du verwendest eine portable Library die auch Threads anbietet wie z. B. Boost.



  • Dann benutze einfach QThread. Du kannst immer, wenn ein Prozentpunkt abgearbeitet wurde ein Signal an den Hauptthread senden, damit der seinen Ladebalken aktualisiert.

    Lies dir die Anleitung zu Threads unter Qt durch und frage dann eine spezifischere Frage.


Anmelden zum Antworten