Verzögerung bei file.write und cronjobs bearbeiten

Alles rund um die Programmierung mit Qt
Antworten
Josh
Beiträge: 6
Registriert: 29. April 2014 14:22

Verzögerung bei file.write und cronjobs bearbeiten

Beitrag von Josh »

Hallo ihr Lieben,

ich habe derzeit 2 Probleme:
1. Beim Schreiben einer Datei sehe ich das Ergebnis immer stark verzögert, ich weiß nicht, was das fertige Programm tut, damit diese Verzögerung eintritt und ich bin mir auch recht unsicher, wie ich eine Datei abschließend beschreibe.

Hier ist das Stück Code:

Code: Alles auswählen

    QFile file(filename);
    file.open(QIODevice::ReadWrite  | QIODevice::Text);
    QByteArray output;

    while (!file.atEnd()) {
        QByteArray line = file.readLine();
        output += line;
        //Hier wird der Output noch bearbeitet, keine file-Methoden werden aufgerufen
    }

    file.resize(0);
    file.write(output);
    file.flush();
    file.close();
Ich denke, ich hab hier nur ein Verständnisproblem:
  • file.resize sollte die Datei leeren, also auf 0Byte Größe setzen
  • file.write sollte die Datei wieder füllen
  • file.flush sollte die Datei nun real beschreiben
  • file.close sollte die Datei sauber schließen
Wenn ich die Datei direkt danach öffne, habe ich keine Änderung... etwa 30sek bis 40sek später, sieht diese allerdings genau so aus, wie sie aussehen sollte. Theoretisch sollte nach Code-Ausführung auch schon alles abgeändert sein. Ich wollte jetzt übrigens nicht auf Streams wechseln. Hat hier jemand eine Idee? PS: Ja, ich habe die Doku gelesen und sicherlich auch schon danach gesucht. Ich habe noch etwas Richtung fsync(file.handle()); gefunden, das hat er aber nicht gekannt und die Doku erklärt mir in diesen Fall leider nicht die genauen Unterschiede der Befehle (sofern ich sie missverstanden habe).

2. Ich möchte die cronjobs über das Programm bearbeiten bzw. eigentlich nur eigene hinzufügen bzw. löschen. Hierfür ist nun die frage, wie ich die cronjobs-Datei als code öffne. Der Linux-Befehl und das Bearbeiten ist mir klar, aber wie öffne ich diese nun so, dass sie QT als Textdatei anerkennt?

Liebe Grüße!
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Verzögerung bei file.write und cronjobs bearbeiten

Beitrag von RHBaum »

2. Cronjobs würd ich nicht auf config file ebene bearbeiten.
schiess doch einfach den cron befehl dafür ab über QProcess ... das Betriebssystem kümmert sich dann um den rest.

1. Lese und schreibe operationen auf file ebene sind vom betriebssystem gepuffert.
Und meistens auch noch von der runtimedie dein compiler benutzt.
Nicht einmal ein flush schreibt "direkt" ....

Alle Standardisierten schreiboperationen sollten gepuffert sein.
Es gibt aber Funktionen im BS (Posix, WIndows API) mit denen du ungepuffert schreiben kannst.
Aber, eben nichts standardisiertes, also plattformunabhaengiges, und auch kein Qt support.
Such mal danach ...
Einfluss drauf hat auch das filesystem und seine einstellungen und mount optionen ....
Vielleicht langts auch ne partition mit extra wenig schreibpuffer und delay zu erzeugen und die daten da lagern.

DIe andere Frage ist, der lesende Zugriff, bei dem du die Verzögerung merkst, ist das dein prozess (von dir kontrolliert) oder einer den nicht (neu) programmieren kannst ?

Ciao ..
Josh
Beiträge: 6
Registriert: 29. April 2014 14:22

Re: Verzögerung bei file.write und cronjobs bearbeiten

Beitrag von Josh »

Hallo und danke,
zu 2. der Befehl würde sicher ausreichen zum Hinzufügen von Cronjobs. Ich wollte allerdings hier auf Nummer sicher gehen, mein Programm tut nun folgendes:
Man hat nun seine Cronjobs

Code: Alles auswählen

Cronjob 1
Cronjob 2
Cronjob 3
Das Programm fügt nun zwischen 2kommentierten Zeilen Cronjobs hinzu:

Code: Alles auswählen

Cronjob 1
Cronjob 2
Cronjob 3
#spezifische Cronjobs
Cronjob 4
Cronjob 5
#Ende der spezifischen
Cronjob 6
Damit kann man auch einfach sagen, bitte alles zwischen den Kommentaren löschen:

Code: Alles auswählen

Cronjob 1
Cronjob 2
Cronjob 3
Cronjob 6
Funktioniert in einer Textdatei super! Und eine solche Bearbeitung dürfte ich mit "crontab -e" nicht hinbekommen afaik.
Es ist einfach wichtig, dass usereigene cronjobs nicht angefasst werden dürfen.

Zu 1. Der lesende Zugriff auf die Daten, die auf dem Linux-Server liegen, habe ich unter Windows per Notepad++ gemacht, dort einfach nach dem Schreiben das Dokument neu geladen. Nach deiner Beschreibung, die für mich derzeit vor allen aussagt "Der Code ist eigentlich nicht schuld." (frei übersetzt ^^), hab ich dann nen Linux-Editor genutzt und die Netzwerkebene außen vorgelassen... tatsächlich wird die Datei sofort nach dem Code-Snippet auch beschrieben, anscheinend kriegt nur das Netzwerk es nicht so schnell mit. Trotzdem danke, das Problem hat sich dann geklärt und erledigt, es ist nicht nötig, dass man die Datei extern öffnen kann. Falls meine Vorgehensweise des Wiederbeschreibens doch noch ne Lücke hat, einfach anmerken.
Antworten