QWriteLocker lockt nicht

Alles rund um die Programmierung mit Qt
Antworten
melle
Beiträge: 5
Registriert: 10. Februar 2010 17:35

QWriteLocker lockt nicht

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wenn jeder Thred einen eigenen ReadWriteLock hat - wie sollte das denn funktionieren?
Außerdem benutzt man zum einfachen Locken nur einen Mutex.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
melle
Beiträge: 5
Registriert: 10. Februar 2010 17:35

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Habe ich doch schon gesagt - Du brauchst einen Mutex welcher jeder Thread locken/unlocken kann.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
melle
Beiträge: 5
Registriert: 10. Februar 2010 17:35

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
melle
Beiträge: 5
Registriert: 10. Februar 2010 17:35

Beitrag 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
Dateianhänge
my_first_qt_app-threaded3.zip
(12.81 KiB) 95-mal heruntergeladen
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Sorry - aber was ist so schwer daran einen Pointer im ctor mit zu übergeben und ihm als Member zu speichern?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
MiKla
Beiträge: 134
Registriert: 29. Juli 2007 15:29

Beitrag 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
melle
Beiträge: 5
Registriert: 10. Februar 2010 17:35

Beitrag von melle »

danke, das war's
Antworten