Zum Inhalt wechseln


Foto

Verständnis Problem...

Windows 7

  • Bitte melde dich an um zu Antworten
7 Antworten in diesem Thema

#1 gooly

gooly

    Newbie

  • 186 Beiträge

 

Geschrieben 22. März 2017 - 10:39

Hi,

ich möchte über die File-Funktionen aus dem kernel32.dll (geht nicht anders) so Files auf eine RAM-Disk schreiben und lesen, dass es dazu kommt, dass gleichzeitig gelesen und geschrieben wird. Auch soll nach dem Leseprozess das File gelöscht werden.

Normal würde man eine NamedPipe nehmen, das geht nicht (will ich nicht), weil das auch auf Linux/Wine laufen soll(te) und der Server der Pipe alles "zwischen" blockiert, das will ich auch nicht.

 

Jetzt sehe ich im kernel32.dll gibt es die Funktionen ReadFileEx, WriteFileEx und SleepEx und auf den Windowsseiten dazu steht, es sei für den "asynchronous procedure call (APC) is queued to the thread".

 

Meinen die damit dass immer nur einer (ein thread) auf so ein File zugreifen kann und man den anderen mit SleepEx(..) in die Warteschleife schicken kann, bis das File freigegeben wurde?

 

Sollte ich dies verwenden, oder die normalen, wenn man die (wie?) so die File-Handels öffnen lässt, dass die Files für andere blockiert sind?

 

Danke!


Bearbeitet von gooly, 22. März 2017 - 10:48.


#2 Damian

Damian

    Moderator

  • 9.302 Beiträge

 

Geschrieben 22. März 2017 - 11:13

Hallo

 

Ich habe das Thema in ein passenderes Unterforum verschoben, da die Anforderungen doch etwas spezieller sind. :)

 

Damian


www.serverhowto.de - das Howto-Projekt des MCSEboard.de

#3 magheinz

magheinz

    Newbie

  • 1.418 Beiträge

 

Geschrieben 22. März 2017 - 12:48

es soll gleichzeitig gelesen und geschrieben werden und wenn das lesen fertig ist wird die datei gelöscht? was wenn der schreibvorgang noch nicht abgeschlossen ist? wozu dann überhaupt noch schreiben wenns eh niemand mehr liest? klingt mir sehr verworren und schreit förmlich nach race conditions?

#4 gooly

gooly

    Newbie

  • 186 Beiträge

 

Geschrieben 22. März 2017 - 13:20

Ist doch ganz einfach, einer schreibt nur und gelegentlich, der andere liest (nur und wenn das File existiert, dann aber schnell), und wenn er das File gelesen hat soll er löschen.

Wie zwei Liebhaber derselben Frau, sie dürfen sich nicht 'begegnen' - nur hier 'löscht' niemand die Frau (hoffentlich). Was ist daran verworren?



#5 Damian

Damian

    Moderator

  • 9.302 Beiträge

 

Geschrieben 22. März 2017 - 17:34

Hallo

 

Bevor jetzt wieder ein kleiner Kampf um Informationen und Interpretationen beginnt, wäre es vielleicht hilfreich, den konkreten Anwendungsfall zu kennen. Eventuell stellt sich dabei ja auch heraus, das diese Anfrage in einem Developer-Forum besser platziert wäre.

 

 

Damian


www.serverhowto.de - das Howto-Projekt des MCSEboard.de

#6 gooly

gooly

    Newbie

  • 186 Beiträge

 

Geschrieben 23. März 2017 - 10:39   Lösung

Also ich habe das Problem jetzt für mich gelöst.

  • Der schreibende Prozess schreibt immer ein neues File. Existiert aber ein File mit dem Namen wird ein Zähler erhöht und der Filename so leicht abgeändert: wrtFile.f0, wrtFile.f1, wrtFile.f2, ...
  • Der lesende Prozess öffnet der Reihe nach alle existierende Files und löscht sie sofort nach dem Lesen.
  • Das alles passiert auf einer Ram-Disk, ja, ja, die gute alte Ramdisk, die gibt's noch :)

So vermeide ich, meine ich,

  1. Kollisionen mit offenen Handles oder
  2. zu gleiches Schreiben und Lesen, wo man dann wieder extra überprüfen muss, was ist gelesen, was neu...
  3. und ich vermeide, dass e.g. ein Pipe- oder Socket-Server alles blockiert, weil er auf was Neues wartet,
  4. es ist (hoffentlich) leicht auch auf Linux/Wine zu portieren (ist ja nur File-Schreiberei) und
  5. ggf. ist es leicht so zu ändern, dass mehrere 'Leser' die Files abfragen können.

Es ist schnell (RAM-Disk) und sehr flexibel, weil nichts speziell.

 

Naja, Ihr könnt das jetzt ja dort hin schieben, wo es am besten passt, dass vielleicht auch andere sich diese Lösung überlegen können.

Gooly


Bearbeitet von gooly, 23. März 2017 - 10:40.


#7 magheinz

magheinz

    Newbie

  • 1.418 Beiträge

 

Geschrieben 23. März 2017 - 10:56

Der Leser kann doch dann immer noch anfangen zu löschen währen geschrieben wird?

Oder ist sichergestellt das die beiden Prozesse nicht gleichzeitig laufen?

Ansonsten würde ich ja einfach mit lock-files arbeiten.


Bearbeitet von magheinz, 23. März 2017 - 11:00.


#8 gooly

gooly

    Newbie

  • 186 Beiträge

 

Geschrieben 23. März 2017 - 12:30

Beide Prozesse laufen parallel, beide getimed mit einen sleep von 15mSec (kleiner geht's normal nicht).

Wann der "Schreiber" schreibt, ist aus der Sicht des "Lesers" nicht vorher bestimmbar - also quasi zufällig.

Der "Leser" soll aber so schnell wir es geht auf den "Schreiber" reagieren.

An das lock-file habe ich nicht gedacht ist aber wohl nicht nötig, da in 99% der Fälle nur ein File für einen Augenblick existiert.

Und so braucht der Leser nur die Existenz der Files zu überprüfen, die er lesen soll, gibt es  keine - tschüss für 15 mSec.

Die Häufigkeit des Schreibens durch den "Schreiber" liegt bei zwischen 1-20 pro Stunde.

Eine Nutzerintervention ist nicht angedacht - nur im Fehlerfall, aber es läuft jetzt seit 5 Stunden problemlos..


Bearbeitet von gooly, 23. März 2017 - 12:38.