2 Threads greifen auf die selbe Datei zu, Wie?



  • Mit _fsopen geht es nicht und die anderen Antworten sind mir ehrlich gesagt ganz schön wage.
    Ich hatte doch schon in der MSDN nachgeschaut und nicht richtig durchgesehen.
    Irgendwie soll es mit CSemaphore gehen, aber ich weiß halt nicht, wie ich das nutzen muß!!!

    Bitte mal ein bisschen konkreter, vielleicht mit einfachem Beispiel

    Gruß

    P.S.: ich werde erstmal mit CFile probieren, bei mir ist es nähmlich mit FILE.
    Vielleicht geht es ja so...



  • Jetzt habe ich alles auf CFile umgeschrieben und es funktioniert auch nicht.
    Außerdem habe ich jetzt auch noch einen Fehler in der Debug-Version genau an folgender Stelle:

    if(!out.Open(out_fn, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary,&fileException))
    			{
    				TRACE("Fehler %u beim Schreiben der Datei.\n",fileException.m_cause);
    			}
    

    Ich weiß jetzt nicht, was da falsch sein soll. Ich kann den Fehler zwar ignorieren und bei der Release-Version kommt erst keiner, aber ich find das nicht so toll. Irgendwas muß ja da falsch sein?

    Ja und der Fehler von Windows ist halt so ein typischer Fehler: Programm hat ein Problem festgestellt und.....

    Gruß



  • Wie soll eigentlich auf die Datei zugegriffen werden?

    Beide lesend.

    Wenn der eine schreibt kann der andere nicht lesen.
    Was du brauchst ist eine Sync. der Thread. critical section objects



  • Also erstmal: Das mit dem Fehler bei CFile ist behoben!

    @Unix-Tom:
    Also beide Threads lesen die Datei. Schreiben auf die Datei fällt aus. Ich erstelle ja eine neue Datei. Also nur beide lesend!!!

    Wenn das mit der Synchronisation nur geht, ja aber wie? Wie schon ein paar mal gesagt habe ich schon in der Hilfe nachgeschaut, aber nicht daraus schlau geworden.
    Muß ich etwa alles wieder neu schreiben?

    Ich brauche mal ein Beispiel..habe bis jetzt noch kein Richtiges gefunden.

    Gruß



  • CSemaphore bringt dir hier überhaupt nichts (einen Semaphore würdest du verwenden, wenn höchstens N threads gleichzeitig auf die Datei zugreifen sollen, aber >N threads laufen)

    Bekommst du nun lesenden Zugriff? Siehst Du die richtigen Daten?
    für konkurrierendes Lesen der gleichen Datei benötigst du keine zusätzliche Synchronisation.



  • Sehe ich auch so wie peterchen.

    Schau dir mal die Parameter fpr CFile an. Da gibt es was für Shared.



  • Das Problem ist aber mit dem CFile nicht behoben. Ich hatte ja auch schon die Flags so gesetzt, das jeder die Datei lesen darf. Geht aber trotzdem nicht.

    Aber steht denn nicht in der Hilfe, das man bei gleichzeitigem Zugriff auf eine Datei synchronisieren muß, oder habe ich das falsch verstanden?

    Ich werde also nochmal weiter suchen

    Bis später...



  • Aber steht denn nicht in der Hilfe, das man bei gleichzeitigem Zugriff auf eine Datei synchronisieren muß

    Wo?

    Beim gleichzeitigen Lesenden Zugriff mußt du nicht synchronisieren, nur wenn einer schreibt, ist die sync normalerweise notwendig.



  • Ich bin erst bescheuert ????!!!!???
    Ich habe denn Fehler jetzt gefunden. Ich hatte ja die Prozeduren getrennt geschrieben, um sie woanders verwenden zu können. Und nun kommt's. In jeder der Prozeduren wird die Datei geöffnet..also zweimal und das geht dann nun wirklich nicht..Also doch noch mal alles umschreiben..Schei...e!!

    Aber danke für die Antworten

    Gruß



  • öhm... natürlich kannst du die gleiche Datei zweimal öffnen (brauchst du sogar für getrennte Seek-Positionen).
    Du mußt nur beim öffnen SHARE_DENY_NONE o.ä. angeben



  • Ja, da habe ich mich nun doch mal wieder geirrt. Hatte aber trotzdem das Problem immer noch, da die Dateien jeweils auch wieder geschlossen werden. Und das ging nicht. Das Problem konnte ich erst beheben, als ich genau den einen Prozess gestartet habe und dann den anderen, umgedreht gehts einfach nicht.
    Ich weiß nicht wieso, aber so gehts halt auch.

    Gruß



  • Was gibt's denn für einen Fehler?



  • evil-peter schrieb:

    CFile::modeCreate|CFile::modeWrite|CFile::typeBinary,&fileException
    

    Du verwendest doch sicher nur modeRead oder?



  • Ja ich verwende nur lesen, aber nicht modeRead sondern MMIO_READ, weil ich das nicht mit CFile mache. Ich benutze da eine eigene Klasse.

    @peterchen:
    Der Fehler ist so ein allgemeiner Fehler in der Anwendung....muß geschlossen werden...usw. Kann ich nichts mit anfangen. Ist mir aber mittlerweile egal, es geht ja jetzt so.

    Gruß



  • Hallo Leute!
    Wie kann ich es realisieren dass zwei threads gleichzeitig auf eine datei zugreifen? einer schreibt und der andere liest?

    Danke



  • Nimm ein IStream Interface. Stichwort: SHCreateStreamOnFile.


  • Mod

    -alex_ schrieb:

    Wie kann ich es realisieren dass zwei threads gleichzeitig auf eine datei zugreifen? einer schreibt und der andere liest?

    Du musst die Datei mit CFile::shareDenyNone öffnen.


Anmelden zum Antworten