Seite 1 von 2

Dateien und Ordner erstellen

Verfasst: 21. Februar 2010 18:54
von acdc
Hallo,

mein Programm benötigt einige Ordner und Datei, in denen es konfigurationsdaten ablegt um dies beim nächsten Start wieder zu laden. Wenn ich nun das Programm das erste Mal starte, dann sind diese natürlich noch nicht vorhanden. Das Programm erstellt natürlich diese Ordner und Dateien, falls sie nicht vorhanden sind.

zb:
QFile f("artikler.config");
if(!f.exists())
{
if (f.open(QIODevice::ReadWrite | QIODevice::Text))
f.close();
}
QFile f2("combo.config");
if(!f2.exists())
{
if (f2.open(QIODevice::ReadWrite | QIODevice::Text))
f2.close();
}
QDir dir("workdir");
if(!dir.exists())
dir.mkdir(dir.absolutePath());
QDir dir2("database");
if(!dir2.exists())
dir2.mkdir(dir2.absolutePath());

das Erstellen funktioniert, nur stürzt das Programm nach dem ersten Start immer ab. Sind diese Dateien und Ordner vorhanden, so gibt es keine Probleme.

Wie kann ich diese Problem beheben bzw. finden!

mfg
acdc

Verfasst: 21. Februar 2010 19:05
von linuQs
An dem geposteten Code liegt es jedenfalls nicht, das Problem muss später in deinem Programm auftreten.
Vielleicht liest du an bestimmten Stellen die Datei/en ein, gehst aber davon aus, dass sie nicht leer sind?
Falls das der Fall ist, musst du bereits beim erstellen der Dateien irgendetwas reinschreiben, in die config Datei z.B. die Standardwerte

Verfasst: 21. Februar 2010 19:08
von acdc
naja wenn sie leer sind, dann hab ich diese Möglichkeit schon abgefangen!

hab in der Dokumenation gelesen, dass
"
The QFile class provides an interface for reading from and writing to files. More...

#include <QFile>

Inherits QIODevice.

Inherited by QTemporaryFile.

Note: All functions in this class are reentrant, except for setEncodingFunction() and setDecodingFunction(), which are nonreentrant.
"
die Funktionen "reentrant" also ablaufinvariant sind. Kann das damit zutun haben?

Verfasst: 21. Februar 2010 19:19
von linuQs
So weit ich weiß, ist reentrant nur wichtig, wenn du mehrere Threads benutzt. Außerdem habe ich vor kurzem selbst so ein Programm geschrieben, das erzeugen der Dateien etc. hat auch gut funktioniert und nachher gab es auch keine Probleme. Wenn du den Fall, wenn die Dateien leer sind, abfängst, weiß ich leider auch nicht, wo der Fehler liegt. Ansonsten vielleicht mal mit Debugger laufen lassen und gucken, wo der Fehler auftritt.

Verfasst: 21. Februar 2010 19:23
von acdc
linuQs hat geschrieben:So weit ich weiß, ist reentrant nur wichtig, wenn du mehrere Threads benutzt. Außerdem habe ich vor kurzem selbst so ein Programm geschrieben, das erzeugen der Dateien etc. hat auch gut funktioniert und nachher gab es auch keine Probleme. Wenn du den Fall, wenn die Dateien leer sind, abfängst, weiß ich leider auch nicht, wo der Fehler liegt. Ansonsten vielleicht mal mit Debugger laufen lassen und gucken, wo der Fehler auftritt.

Kann ich in Netbeans auch QT debuggen, welches Programm beutze ch da?

-Hat jemand einen guten Vorschlag?

Verfasst: 21. Februar 2010 19:27
von gon
Ich lese es so, daß wenn die Datei offen ist ein ReadWrite Befehl gesetzt ist. Zu diesem Zeitpunkt ist die Datei aber noch nicht offen wie ich meine.

>> Datei.open(QIODevice::ReadWrite);
>>
>>
>> if(Datei.isOpen())
>> {
...........


und so weiter.


Achim

Verfasst: 21. Februar 2010 19:36
von acdc
ok, habe readwrite auf WriteOnly gesetzt.

mit dem Dbugger vom Qt Creater kommt beim Starten nun folgende Meldung:

Der Prozess wurde durch erhalt eines Signals vom Betriebsystem angehalten.
Name des Signals: SIGSEGV
Bedeutung: Segmentation fault

->(siese Zeile ist markiert worden)0 ZN7QObjectC2EPS_ C:\Qt\2010.01\qt\bin\QtCore4.dll 0 0x6a2c4c79
1 ?? 0 0x00402990
2 ?? 0 0x0058adb0
3 ?? 0 0xbaadf00d
4 ?? 0 0x0028fce8
5 ZN14QWidgetPrivate13createTLExtraEv C:\Qt\2010.01\qt\bin\QtGui4.dll 0 0x65144ad8
6 ?? 0 0x0040a340
7 ?? 0 0x0058adb0
8 ?? 0 0x0028fe28
9 ?? 0 0x0028fdec
10 ?? 0 0x0058a2e8
11 ?? 0 0x014a8d7e
12 ?? 0 0x00000000


im Disasambler wird diese Zeile markiert!

8: 0x6a2c4c79 mov 0x4(%ebx),%eax

Das ist für mich nicht sehr aussagekräftig

Verfasst: 21. Februar 2010 20:11
von linuQs
Unter Linux kannst du einfach den gdb zum debuggen benutzen, mit Windows kenne ich mich da leider nicht aus.
Aber wenn du keinen Debugger hast / der nicht funktioniert, kannst du auch einfach an einigen Stellen im Code sowas wie

Code: Alles auswählen

qDebug() << "Test 1";
...
qDebug() << "Test 2";
...
qDebug() << "Test 3";
einbauen. Wenn du dann ungefähr weißt, wo der Fehler auftritt, an die Stelle noch mehr Zeilen einfügen. Das ist bei sehr viel Code natürlich umständlich, aber wenigstens findest du dann raus, wo der Fehler liegt

Verfasst: 21. Februar 2010 20:40
von acdc
Also Folgendes:

hatte eine Idee.

int main(int argc, char *argv[])
{
init();
QApplication a(argc, argv);
a.addLibraryPath(a.applicationDirPath());
#ifdef Q_WS_WIN
//qInstallMsgHandler( debugOutput );
#endif
MainWindow w;
w.show();

return a.exec();
}

das qInstallMsgHandler( debugOutput ); lies ich weg und es funktionierte alles einwandfrei!

danke für Eure Vorschläge und ich hoffe es bleibt auch dabei, dass alles funktioniert!

Verfasst: 22. Februar 2010 10:34
von AuE
Poste mal den Code vom MessageHandler. Ich nutze das hier unter Unix (Debian x64>) auch - keine Probleme!

Verfasst: 22. Februar 2010 11:32
von acdc
AuE hat geschrieben:Poste mal den Code vom MessageHandler. Ich nutze das hier unter Unix (Debian x64>) auch - keine Probleme!

void debugOutput(QtMsgType type, const char *msg)
{
static QTextBrowser *browser= new QTextBrowser();
browser->setWindowTitle("Debug-Fenster");
browser->move(700,30);
browser->show();
switch(type)
{
case QtDebugMsg:
browser->append(QString("Debug: %1").arg(msg));
break;
case QtWarningMsg:
browser->append(QString("Warning: %1").arg(msg));
break;
case QtCriticalMsg:
browser->append(QString("Critical: %1").arg(msg));
break;
case QtFatalMsg:
browser->append(QString("Fatal: %1").arg(msg));
break;
}
}

Verfasst: 22. Februar 2010 11:43
von AuE
Ich tippe mal auf deinen Textbrowser ;-)

Code: Alles auswählen

void handleOutput(QtMsgType type, const char *msg)
{
	switch (type)
	{
	     case QtDebugMsg:
		 fprintf(stderr, "Debug: %s\n", msg);
		 QMessageBox::information(NULL, "Debug", QString(msg));
		 break;
	     case QtWarningMsg:
		 fprintf(stderr, "Warning: %s\n", msg);
		 QMessageBox::information(NULL, "Warning", QString(msg));
		 break;
	     case QtCriticalMsg:
		 fprintf(stderr, "Critical: %s\n", msg);
	 QMessageBox::information(NULL, "Critical", QString(msg));
		 break;
	     case QtFatalMsg:
		 fprintf(stderr, "Fatal: %s\n", msg);
		 QMessageBox::information(NULL, "Fatal", QString(msg));
		 abort();
	}
 }

Verfasst: 22. Februar 2010 12:39
von acdc
AuE hat geschrieben:Ich tippe mal auf deinen Textbrowser ;-)

Code: Alles auswählen

void handleOutput(QtMsgType type, const char *msg)
{
	switch (type)
	{
	     case QtDebugMsg:
		 fprintf(stderr, "Debug: %s\n", msg);
		 QMessageBox::information(NULL, "Debug", QString(msg));
		 break;
	     case QtWarningMsg:
		 fprintf(stderr, "Warning: %s\n", msg);
		 QMessageBox::information(NULL, "Warning", QString(msg));
		 break;
	     case QtCriticalMsg:
		 fprintf(stderr, "Critical: %s\n", msg);
	 QMessageBox::information(NULL, "Critical", QString(msg));
		 break;
	     case QtFatalMsg:
		 fprintf(stderr, "Fatal: %s\n", msg);
		 QMessageBox::information(NULL, "Fatal", QString(msg));
		 abort();
	}
 }
Hab nun einmal den Code getauscht und es scheint zu funktionieren - auf das wär ich wahrscheinlich nie gekommen.

Warum tritt das Problem nun genau auf?

mfg acdc

Verfasst: 22. Februar 2010 12:46
von Christian81
Naja - spätestens bei der zweiten Ausabe hat man zwei Textbrowser...

Verfasst: 22. Februar 2010 13:40
von TSS
Christian81 hat geschrieben:Naja - spätestens bei der zweiten Ausabe hat man zwei Textbrowser...
Da der QTextBrowser static ist, sollte das eigentlich nicht der Fall sein:

Code: Alles auswählen

static QTextBrowser *browser= new QTextBrowser();