Seite 1 von 1

qSort iteriert über Ende eines QMultiHash

Verfasst: 20. Mai 2006 20:33
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

Update

Verfasst: 22. Mai 2006 08:33
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

Verfasst: 27. Mai 2006 01:20
von uhu01
nochmal nach oben...sry, aber irgendjemand muss doch ne idee haben