OVH Cloud OVH Cloud

Ecritures synchronisées dans un CFile ?

4 réponses
Avatar
ByB
Bonjour,

Je développe une application (un jeu de plateau) en VC++ avec les MFC.
Je souhaite tracer dans un fichier les numéros de cases où on pose des
pions etc.

Je me suis dit que j'allais "simplement" écrire dans un fichier (CFile
myfile; myfile.Write(...); myfile.Close(); etc) les coups joués par le
joueur humain et ceux joués par l'ordinateur.

Or, je retrouve les coups joués dans mon fichier ... mais en désordre :
parfois, deux coups de l'ordinateur à la suite, alors que l'ordinateur
et l'humain jouent chacun leur tour ...

Les écritures dans un fichier CFile sont elles asynchrones ? Est-il
possible qu'elles ne se fassent pas dans l'ordre où elles sont
programmées ? J'ai pourtant essayé :

myfile.Open();
myfile.Write();
myfile.Flush();
myfile.Close();

à chaque écriture, en pensant que le Flush, et la fermeture du fichier
obligeraient l'ordinateur à finir chaque écriture avant d'attaquer la
suivante, mais ça ne change rien ...

Quelle est la méthode qui permet de forcer chaque écriture à se
terminer avant de passer à la suite du programme ?

Merci !


--
Les aspirations des pauvres ne sont pas très éloignées des réalités des
riches.
[Pierre Desproges]

4 réponses

Avatar
Vincent Burel
"ByB" wrote in message
news:
Bonjour,

Je développe une application (un jeu de plateau) en VC++ avec les MFC.
Je souhaite tracer dans un fichier les numéros de cases où on pose des
pions etc.

Je me suis dit que j'allais "simplement" écrire dans un fichier (CFile
myfile; myfile.Write(...); myfile.Close(); etc) les coups joués par le
joueur humain et ceux joués par l'ordinateur.

Or, je retrouve les coups joués dans mon fichier ... mais en désordre :
parfois, deux coups de l'ordinateur à la suite, alors que l'ordinateur
et l'humain jouent chacun leur tour ...

Les écritures dans un fichier CFile sont elles asynchrones ? Est-il
possible qu'elles ne se fassent pas dans l'ordre où elles sont
programmées ? J'ai pourtant essayé :

myfile.Open();
myfile.Write();
myfile.Flush();
myfile.Close();



Le flush n'est pas nécessaire (normallement fait au close)... par contre il
faut etre sur que le curseur pointe sur la fin du fichier (seek)... il faut
aussi que votre fonction de sauvegarde de coup, soit appelée par un seul
thread.

VB
Avatar
ByB
Vincent Burel vient de nous annoncer :


Le flush n'est pas nécessaire (normallement fait au close)... par contre il
faut etre sur que le curseur pointe sur la fin du fichier (seek)... il faut
aussi que votre fonction de sauvegarde de coup, soit appelée par un seul
thread.

VB



Effectivement, j'avais oublié de préciser que je fais aussi un :

myfile.SeekToEnd()

avant le write (et ça ne change rien ...).

Et je n'ai a priori qu'un seul thread dans mon programme (mais j'ai
une fonction qui est appelée par l'envoi d'un message que j'ai défini
moi même. Est ce que cela en fait un deuxième thread ?)




--
LA FINALITE PONCTUE LES PROCESSUS FONDAMENTAUX DE LA DEMARCHE
Avatar
Arnold McDonald \(AMcD\)
T'es en multithread peut-être ?

--
Arnold McDonald (AMcD)

http://arnold.mcdonald.free.fr/
Avatar
Vincent Burel
"ByB" wrote in message
news:
Vincent Burel vient de nous annoncer :

>
> Le flush n'est pas nécessaire (normallement fait au close)... par contre


il
> faut etre sur que le curseur pointe sur la fin du fichier (seek)... il


faut
> aussi que votre fonction de sauvegarde de coup, soit appelée par un seul
> thread.
>
> VB

Effectivement, j'avais oublié de préciser que je fais aussi un :

myfile.SeekToEnd()

avant le write (et ça ne change rien ...).

Et je n'ai a priori qu'un seul thread dans mon programme (mais j'ai
une fonction qui est appelée par l'envoi d'un message que j'ai défini
moi même. Est ce que cela en fait un deuxième thread ?)



non ca fait toujours qu'un seul thread, mais vous devriez appeler
directement votre fonction de sauvegarde plutot que de passer par la
Msg-Loop... et vérifiez qu'il n'y ait pas de possibilité d'envoyer les
messages dans le désordre...