Hallo,
ich lausche mit dem FileSystemWatcher auf ein Verzeichnis, wo ständig FTP-Files eingehen. Wenn ich weiß, daß ein neues File da ist, teste ich in einer Schleife mit open(QFile::WriteOnly), ob die Datei nun fertig hochgeladen ist (und der File-Lock endlich verschwunden ist). Dann kann ich selbst zugreifen (obwohl nur Lesezugriff von mir gewollt ist).
Gibt's hier ne elegantere Methode? Evtl. ohne Polling und mit Ereignissen? Wie würdet ihr das machen?
Ereignis/Test, ob fremder File-Write beendet wurde
Hi,
da sonst keiner was zu sagen hat mach ich das jetzt mal
So ne richtig elegante Lösung fällt mir jetzt im Moment auch nicht ein, du solltest aber auf jeden Fall einen Timer oder ein Sleep einbauen, damit du das System nicht nur mit pollen auslastest. Also wartezeit würd ich vielleicht die durchschnittliche Zeit von der durchschnittlichen Größe aller Files ranziehen
Gruß,
Andy
da sonst keiner was zu sagen hat mach ich das jetzt mal
So ne richtig elegante Lösung fällt mir jetzt im Moment auch nicht ein, du solltest aber auf jeden Fall einen Timer oder ein Sleep einbauen, damit du das System nicht nur mit pollen auslastest. Also wartezeit würd ich vielleicht die durchschnittliche Zeit von der durchschnittlichen Größe aller Files ranziehen
Gruß,
Andy
Danke für die Antwort. Jo, ich kenn mich da ein bissel aus.
Diese Art "Busy-waiting" hab ich in einem Thread laufen, wobei die dazugehörige Schleife auch regelmäßig 500 ms schläft. Zudem wird immer ein "bye-bye"-Boolean getestet, sodaß beim Quit vom User die Schleife immer sauber beendet wird (mit max. Verzögerung von 500 ms in diesem Fall).
Hier ist der Code zum Busy-waiting, denn ich gerne vermeiden würde:
Die innere Schleife ist nur zum schnellen Reagieren bei einem Quit vom Benutzer gedacht, ohne dabei zu hochfrequent die Datei pollen zu müssen.
Diese Art "Busy-waiting" hab ich in einem Thread laufen, wobei die dazugehörige Schleife auch regelmäßig 500 ms schläft. Zudem wird immer ein "bye-bye"-Boolean getestet, sodaß beim Quit vom User die Schleife immer sauber beendet wird (mit max. Verzögerung von 500 ms in diesem Fall).
Hier ist der Code zum Busy-waiting, denn ich gerne vermeiden würde:
Code: Alles auswählen
while(!file.open(QIODevice::ReadWrite) && !_bye)
{
for(int i = 0; i < 2 && !_bye; i++)
{
msleep(500);
std::cout << "Datei noch besetzt!" << std::endl;
}
}