[gelöst][Qt4][QMutex] QMutex::lock() wirft Exception

Alles rund um die Programmierung mit Qt
Antworten
uhu01
Beiträge: 150
Registriert: 10. Juli 2005 20:46

[gelöst][Qt4][QMutex] QMutex::lock() wirft Exception

Beitrag von uhu01 »

Hy!

Ich habe folgendes Problem:
Wenn ich in einer Klasse einen QMutex locken will, wirft dies eine Exception: "Access violation reading location..."

QMutex funktioniert jedoch in ein paar anderen Klasse wundervoll.
Mein Code:

Code: Alles auswählen

#ifndef C_USER_CONFIG_H_
#define C_USER_CONFIG_H_

#include <QStringList>
#include <QMutex>

class QString;

class CUserConfig {
public:
	CUserConfig();
	~CUserConfig();
	void setValue( const QString& _name, const QString& _value);
	QString getValue( const QString& _name);
	int isSet( const QString& _name);
	QString operator()( const QString& _name);
	QString& operator[]( const QString& _name);
	const QStringList& getNamesList() const { return m_strlstNames; }
	const QStringList& getValuesList() const { return m_strlstValues; }
	// TODO: save to file
private:
	QStringList m_strlstNames;
	QStringList m_strlstValues;
	QMutex m_lock;
};

#endif // C_USER_CONFIG_H_
Das ist dann der Code dazu:

Code: Alles auswählen

#include "CUserConfig.h"

#include <QStringList>
#include <QMutex>
#include <QMutexLocker>

CUserConfig::CUserConfig() {
}

CUserConfig::~CUserConfig() {
}

void CUserConfig::setValue( const QString& _name, const QString& _value) {
	QMutexLocker locker( &m_lock);
	int pos;
	if( (pos = m_strlstNames.indexOf( _name)) == -1) {
		m_strlstNames.append( _name);
		m_strlstValues.append( _value);
	} else {
		m_strlstValues[pos] = _value;
	}
}

QString CUserConfig::getValue( const QString& _name) {
	QMutexLocker locker( &m_lock);
	int pos;
	if( (pos = m_strlstNames.indexOf( _name)) == -1) {
		return QString();
	} else {
		return m_strlstValues.at(pos);
	}
}

int CUserConfig::isSet( const QString& _name) {
	QMutexLocker locker( &m_lock);
	int pos = m_strlstNames.indexOf( _name);
	return pos;
}

QString CUserConfig::operator()( const QString& _name) {
	return getValue( _name);
}
Mein Programm ruft operator() mit einem gültigen String auf, mit den anderen Funktionen hab ich's noch nicht probiert.

Weis echt nicht mehr weiter, verwende noch 5 andere QMutex im selben Programm, diese sperren und entsperren jedoch ohne Problem. Auch das nicht verwenden von QMutexLocker bringt keinen Unterschied.

Irgendjemand eine Idee?

PS: ich verwende Qt 4.0.1, da ich erst upgraden will, wenn das Programm an dem ich gerade schreibe einigermassen fertig ist.

mfg
uhu01
Zuletzt geändert von uhu01 am 3. Januar 2006 01:09, insgesamt 1-mal geändert.
uhu01
Beiträge: 150
Registriert: 10. Juli 2005 20:46

Beitrag von uhu01 »

Hy!

Anscheinend gibt jeder Zugriff auf einen Member der Klasse einen Fehler, jedoch erst nachdem ich das Widget dem ich eine Referenz auf die Klasse übergeben habe aufgerufen habe (.show())

main.cpp

Code: Alles auswählen

#include <QApplication>

#include "CFebmChat.h"
#include "CUserConfig.h"

int main( int argc, char *argv[]) {
	QApplication app( argc, argv);
	CUserConfig conf;

	conf.setValue( "name", "uhu01");
	conf.setValue( "userformat", "<strong>%1</strong>: %2");
	conf.setValue( "systemformat", "<strong><font color=\"red\">%1</font></strong>");

	CFebmChat chat( "\\Device\\NPF_{4B377598-2FAD-4105-9422-8A931AFDE654}", conf);
	chat.show();

	return app.exec();
}
Ausschnitt CFebmChat.h

Code: Alles auswählen


class CFebmChat : public QWidget {
	Q_OBJECT
public:
	CFebmChat( QString _interf, CUserConfig& _conf, QWidget* parent = 0);
...
	CUserConfig& m_config;
...
protected slots:
	void enqueueMessage();
	void insertHtml( QString _text);
};
Ich habe jedoch auch bei meinen beiden Threads das gleiche gemacht (referenz übergeben), dort funktioniert alles Problemlos.

Der Fehler kommt übrigens von einem Aufruf in enqueueMessage:

Code: Alles auswählen

...
	m_protocol.parseSend( strLine);
...
Wobei bei diesem Aufruf folgender Code Aufgerufen wird:

Code: Alles auswählen

void CFEBMProtocol::parseSend( const QString& _str, enMessageType _type /* = MT_MESSAGE */) {
	switch( _type) {
	    case MT_MESSAGE:
			QString temp;
			temp += (QChar(static_cast<unsigned char>(MT_MESSAGE)));
			temp += m_config("name");
			temp += _str;
			m_queue.enqueue( temp);
	        break;
	}
}
Die CFEBMProtocol Klasse hat die CUserConfig Klasse ebenfalls per Referenz übergeben bekommen.

Wenn ich noch mehr Code posten soll, einfach sagen...

mfg
uhu01
uhu01
Beiträge: 150
Registriert: 10. Juli 2005 20:46

Beitrag von uhu01 »

Hy!

Habe den Fehler gerade gefunden, absoluten Blödsinn gemacht gehabt. Ich hatte beim Initialisieren des der Member der CFebmChat Klasse die CFEBMProtocol Klasse mit dem Member m_config (der Referenz auf die CUserConfig Klasse) initialisiert, obwohl diese Referenz (anscheinend) noch nicht zugewiesen worden war. Das obwohl sie eigentlich vorher initialisert hätte werden sollen.

mfg
uhu01
Antworten