Seite 1 von 1

QWriteLocker lockt nicht

Verfasst: 10. Februar 2010 17:51
von melle
Hallo,

ich benutze Qt 4.6.0. Ich habe eine Anwendung, in der aus dem Gui nicht-GUI-Threads gestartet werden. Ich möchte aber, dass immer nur ein Thread gleichzeitig läuft.

Code: Alles auswählen

#include <QtGui> 
#include "myqtapp.h"

myQtApp::myQtApp(QWidget *parent)
{
	setupUi(this); // this sets up GUI

	// signals/slots mechanism in action
	connect( pushButton_lmain, SIGNAL( clicked() ), this, SLOT( launch_in_main() ) ); 
	connect( pushButton_lnew, SIGNAL( clicked() ), this, SLOT( launch_in_new() ) ); 

}


void myQtApp::launch_in_main()
{
	qDebug() << "Executing in main thread, GUI is now blocked";
		
	for(int i=0;i<10;i++)
	{
		qDebug() << "Time to wait: " << 10-i;
		int t=1;

		// some OS specific stuff
		// mingw (3.4.2) sleep on windows is called _sleep and uses microseconds
		#ifdef Q_OS_WIN32
		t = t * 1000;
		_sleep(t);
		#else
		sleep(t);
		#endif

	}

	qDebug() << "Now you can operate with GUI";
}


void myQtApp::launch_in_new()
{
	// create new thread (on heap) and start it
	thread = new MyThread(this);
	thread->start(); // after this, thread's run() method starts 

}
Mit den Threads sieht es so aus:

Code: Alles auswählen

#include "mythread.h"
#include <QWriteLocker>

MyThread::MyThread(QObject *parent)
: QThread(parent)
{
}

void MyThread::run()
{
       //lock.lockForWrite();
        QWriteLocker locker(&lock);


	qDebug() << "Executing in new independant thread, GUI is NOT blocked";
		
	for(int i=0;i<10;i++)
	{
		qDebug() << "Time: " << 10-i;	

		int t=1;

		// some OS specific stuff
		// mingw (3.4.2) sleep on windows is called _sleep and uses microseconds
		#ifdef Q_OS_WIN32
		t = t * 1000;
		_sleep(t);
		#else
		sleep(t);
		#endif

	}
        //lock.unlock();
	
	qDebug() << "Execution done";
	
	exec();
}
und

Code: Alles auswählen

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QtGui>

class MyThread : public QThread
{
	Q_OBJECT

public:
	MyThread(QObject *parent);
	void run(); // this is virtual method, we must implement it in our subclass of QThread


private:
        QReadWriteLock lock;

};


#endif
Der QWriteLocker locker springt aber nicht an. Ich kann beliebige Threads starten. Sie blockieren sich nicht.

Könnt ihr mir bitte helfen?

Danke

Verfasst: 10. Februar 2010 18:48
von Christian81
Wenn jeder Thred einen eigenen ReadWriteLock hat - wie sollte das denn funktionieren?
Außerdem benutzt man zum einfachen Locken nur einen Mutex.

Verfasst: 10. Februar 2010 22:08
von melle
Christian81 hat geschrieben:Wenn jeder Thred einen eigenen ReadWriteLock hat - wie sollte das denn funktionieren?
Außerdem benutzt man zum einfachen Locken nur einen Mutex.
Und wo schreibe den den Mutex oder was auch immer hin?

Verfasst: 10. Februar 2010 22:15
von Christian81
Habe ich doch schon gesagt - Du brauchst einen Mutex welcher jeder Thread locken/unlocken kann.

Verfasst: 11. Februar 2010 09:15
von melle
Christian81 hat geschrieben:Habe ich doch schon gesagt - Du brauchst einen Mutex welcher jeder Thread locken/unlocken kann.
Ich weiß :? Ich weiß nur nicht, was ich falsch mache. Vielleicht hast du recht, dass wenn ich den Mutex im Thread setze, dann wird er für jeden Thread neu erstellt. So steht es aber auch in allen Anleitungen.
Wenn ich ihn im Hauptprogramm um den Aufruf des Threads setze, dann ist es vielleicht nur einer, es geht aber ebenso wenig.

Bitte helfe mir und sage mir, wo mein Fehler ist.

Danke

Verfasst: 11. Februar 2010 09:44
von Christian81
Einen Mutex in der Hauptklasse erstellen und einen Pointer darauf jedem Thread mitgeben. Fertig.
Und wenn das nicht gehen sollte - bitte Beispielcode zeigen bzw. anhängen damit wir sehen was Du ggf. falsch machst.

Verfasst: 11. Februar 2010 16:30
von melle
Christian81 hat geschrieben:Einen Mutex in der Hauptklasse erstellen und einen Pointer darauf jedem Thread mitgeben. Fertig.
Und wenn das nicht gehen sollte - bitte Beispielcode zeigen bzw. anhängen damit wir sehen was Du ggf. falsch machst.
Stimmt, du hast Recht, das macht Sinn. Mein Problem ist, dass ich es es nicht schaffe, einen Pointer auf einen Mutex (oder den von mir benutzen QWriteLocker) zu übergeben. Dafür habe ich mir in dem thread eine Hilfsfuktion start_me() geschrieben, die einen Alias für den Pointer auf den locker bereitstellt.

Jetzt bekomme ich am Schluss aber eine Fehlermeldung beim Verknüpfen mit dem Alias.

Ich habe im Anhang die Dateien mit .pro-Datei angehängt. Ich bin für alle Hinweise dankbar. :D

Verfasst: 11. Februar 2010 19:38
von Christian81
Sorry - aber was ist so schwer daran einen Pointer im ctor mit zu übergeben und ihm als Member zu speichern?

Verfasst: 11. Februar 2010 20:46
von MiKla

Code: Alles auswählen

void MyThread::start_me(QReadWriteLock *lock)
{
...
QReadWriteLock *lock_alias = lock;
...
}
macht keinen Sinn, wenn es im Header schon deklariert wurde.
Also nur den Pointer übergeben

Code: Alles auswählen

lock_alias = lock
Dann wo der Lock erfolgen soll

Code: Alles auswählen

    lock_alias->lockForRead();
    lock_alias->lockForWrite();
    //mach was...
    lock_alias->unlock();
Michael

Verfasst: 12. Februar 2010 09:38
von melle
danke, das war's