qSort iteriert über Ende eines QMultiHash

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

qSort iteriert über Ende eines QMultiHash

Beitrag von uhu01 »

Hy!

Ich habe folgendes Problem:
Ich muss Windows-Registry Einträge die in einem ini-Artigen File (.axt von Novell) stehen in die Windows Registry schreiben. Ich parse zuerst das AXT-File in ein XML, um dann die Einträge schneller schreiben zu können möchte ich allerdings ein .reg File erstellen, und dieses per QProcess("regedit"...) eintragen lassen.
Momentan läuft das Erstellen des reg Files in einem Thread, in dem ich die Daten (Schlüssel und Werte) in ein QMultiHash einlesen. Als Schlüssel im MultiHash verwende ich die Registry-Schlüssel, da ich die Werte die in denselben Schlüssel gehören untereinander in das reg-File schreiben muss. Dazu sortiere ich den QMultiHash mit qSort (QtAlgorithms) nach dem Schlüssel. Hier tritt allerdings mein Problem auf. Manchmal tritt hierbei der Fehler: ASSERT failure in QHash: "Iterating beyond end()", file e:\system\qt\src\corelib\tools\qhash.cpp, line 180
auf. Dies allerdings nicht immer, manchmal funktioniert es 5-6 mal, bis dieser Fehler auftritt.
Dies ist der Codeteil bei dem der Fehler auftritt:

Code: Alles auswählen

appNode = appNode.firstChild();

QMultiHash< QString, RegistryKeyFactory::AbstractRegistryKey*> keys;
RegistryKeyFactory::AbstractRegistryKey* key;
QDomElement element;
while( !appNode.isNull())
{
	element = appNode.toElement();
	key = RegistryKeyFactory::createElement( element);
	keys.insert( element.attribute("path"), key);
	appNode = appNode.nextSibling();
}
qDebug() << keys.count();
qSort( keys.begin(), keys.end());
QMultiHash< QString, RegistryKeyFactory::AbstractRegistryKey*>::iterator i = keys.begin();
regStream << "Windows Registry Editor Version 5.000" << '\r' << '\n' << '\r' << '\n';
Der zugehörige XML-Ausschnitt:

Code: Alles auswählen

<registry>
 <string path="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\SequoiaView" value="SequoiaView" name="DisplayName" />
 <string path="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\SequoiaView" value="C:\Programme\SequoiaView\Uninstal.exe" name="UninstallString" />
 <binary path="HKEY_LOCAL_MACHINE\SOFTWARE\Description\Microsoft\Rpc\UuidPersistentData" value="A0,92,DB,02,65,0D,D5,01" name="LastTimeAllocated" />
</registry>
Zu Beginn der Ausführung des Code-Teils ist AppNode der <registry> Knoten im XML.

Wie gesagt, der Fehler tritt nicht immer auf, manchmal beim ersten Versuch, manchmal beim dritten, oder sechten (oder dazwischen).
Muster konnte ich dahinter keines entdecken. Ich werde die Erstellung des reg's zwar noch in den Thread verschieben der das XML erstellt, damit ich das gleich auf einmal machen kann, dort kann ich es allerdings auch nicht anders machen, da die einzelnen Registry Einträge nicht nach Schlüssel sortiert eingetragen sind.

Sollte sich jemand den ganzen Source anschauen wollen:
SVN-Repo

Abei noch ein Beispiels AXT und die resultierenden XML und REG.

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

Update

Beitrag von uhu01 »

Hy!

Ich habe jetzt auf Qt 4.1.3 geupdated, jetzt bekomme ich wenigstens einen Fehler (werden über qDebug() ausgegeben)...

Wenn es funktioniert bekomme ich

Code: Alles auswählen

QEventDispatcherUNIX::unregisterTimer: invalid argument
Das seltsame hierbei ist nur das ich unter Windows Programmiere?!
Wenn es nicht funktioniert bekomme ich aus einer Endlosschleife

Code: Alles auswählen

QObject::killTimer: timers cannot be stopped from another thread
Irgendjemand einen Idee...Ich bin schön langsam am verzweifeln.

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

Beitrag von uhu01 »

nochmal nach oben...sry, aber irgendjemand muss doch ne idee haben
Antworten