Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.8.0 - Qt Creator : 4.3.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Crash avec l'opérateur

24 Feb modifié dans Qt / Langage C++
Bonjour à tous,
Voila j'ai de manière assez aléatoire des crashs sur les lignes comportant l’opérateur<< de QTextStream.

Je doit écrire dans un fichier temporaire certaines donnés, puis ce fichier temporaire et relu par le soft qui traite les données au fur qui sont mise dans un fichier final avant de supprimer le fichier temporaire sachant que ces actions sont répété en boucle pendant un certain temps. Cela me permet de traiter zone après zone mes informations.

Or de manière tout a fait aléatoire d'un coup je ne peux plus supprimer mon fichier temporaire puis même si j'écrase le contenu de mon fichier au bout d'un moment je ne peut plus écrire dans mon fichier final . je reçois l'erreur : <blockquote>The inferior stopped because it triggered an exceptions. Stopped in thread 11 by : Exception at 0x7ffb78a841es, code: 0x0000005: write acces violation at 0x1, flag= 0x0

lorsque je passe par le bout de code suivant :
 if ( flux.status() != QTextStream::Ok)
return;
if (flux.device() == NULL)
return;

if (direction == HORIZONTAL)
{
flux << "1vv10.0" << endl; // ligne du crash
}
le crash se fait sur la ligne
flux << "1vv10.0" << endl;
J'ai également pu avoir la meme erreur lors de l'utilisation de qDebug()

pour information j'utilise Qtcreator avec QT 5.2.1

Réponses

  • J'ai tenté également de temporiser la suppression du fichier temporaire comme ceci mais cela ne change rien :
    bool ExportWorskpaceToLWO::deleteFileTmp()
    {
    int tentative = 0;
    bool success = false;
    while ((!(success = QFile::remove(fichierTmpCourrant.absoluteFilePath())))&& tentative <5)
    {
    QThread::msleep(50);
    ++tentative;
    }
    return success;

    }
  • 10 Mar modifié
    C'est certainement HS mais bon :
    bool QFileDevice::flush()
    Flushes any buffered data to the file. Returns true if successful; otherwise returns false.
    Sinon, le fichier est bien close(); avant ta tentative de suppression ?
  • Quel est le type de la variable "flux" ?
  • Trouvé en feuilletant la doc : une classe de nom "QTemporaryFile" qui fournit des fichiers temporaires qu'elle se charge de détruire quand le moment est venu.
  • Bonjour si tu utilises un fichier dans plusieurs thread de ton processus (au cas ou c'est le cas bien sur) il faut utiliser un mutex donc dans Qt un QMutex ....
  • Bonjour, merci d'avoir pris le temps de me répondre et désolé de ne vous répondre que maintenant. Urgence sur un autre projet oblige.
    Sinon, le fichier est bien close(); avant ta tentative de suppression ?
    j'ai mis des qdebug au moment de la suppression et oui je confirme que le fichier est fermé avant la tentative de suppression . Du moins je passe bien par le close
    Quel est le type de la variable "flux" ?
    "flux" est un QDataStream
    Trouvé en feuilletant la doc : une classe de nom "QTemporaryFile" qui fournit des fichiers temporaires qu'elle se charge de détruire quand le moment est venu.
    Je vais essayer de regarder de ce coté la.
    Bonjour si tu utilises un fichier dans plusieurs thread de ton processus (au cas ou c'est le cas bien sur) il faut utiliser un mutex donc dans Qt un QMutex
    La création, le remplissage, la lecture et la suppression des fichier ce fait dans le même thread
  • Cela sera certainement encore HS, mais si tout ce fait dans le même thread :
    QThread::msleep(50);
    Ne fera que retarder le problème non ?
    Contrairement à un processEvent(); qui, lui, temporiserait réellement ??
  • en effet, mais je me suis dis ( c'est peut être bête hein ) que c'était Windows qui n'avait éventuellement pas le temps de réaliser que le fichier était bien fermé.
  • 20 Mar modifié
    faut dire que :
    write acces violation
    est assez clair ;)
    Si tu es certain d'avoir tous les droits sur ton fichier :
    ->setPermissions(QFileDevice::ReadOther | QFileDevice::WriteOther | QFileDevice::ExeOther);
    Si tu es certain de ne pas supprimer un fichier dans lequel tu es en train d'écrire de lire, où qui n'est simplement pas fermé ...
    C'est que le problème vient certainement du reste du code que l'on ne voit pas, non ?
  • 20 Mar modifié
    Ta boucle while est une horreur ;) : on n'a jamais à faire cela.

    Quant à l'idée que l'OS n'aurait pas le temps de réaliser... euh... je ne commenterai point !

    Je n'ai pas vraiment d'idée, mais je remarque juste que tu te cognes à une erreur de type violation de mémoire : ce n'est pas rien, c'est même un gros plantage, du genre de celui qu'on obtient avec un pointeur moisi, alors que si tu essayes juste d'écrire dans un fichier déjà fermé ou en lecture seule ou au-delà de la fin du fichier la punition est bien moins lourde.
    Exemple : je viens d'essayer de supprimer
    - un fichier encore ouvert
    - un fichier en lecture seule
    - un fichier qui n'existe pas
    QFile::remove ("fichier") me retourne juste 'false' et le code continue.
  • 21 Mar modifié
    PapaJaac à forcément raison, c'est une évidence.
    Après, j'ai aussi un bout de code qui repose sur la gestion d'un QFile et dont le résultat est particulièrement incertain sans que j'en comprenne la raison (c'est pour cela que j'écoute attentivement ce post).
    Quant à l'idée que l'OS n'aurait pas le temps de réaliser... euh... je ne commenterai point !
    Et pourtant, j'aimerai bien ! ;) Es tu certain que cela est impossible car mon problème y ressemble grandement ? (mon QFile est dans un destructeur et régulièrement il manque des lettres, voir des phrases entières ...(en plein milieu de n'importe où !!!!))

    Sinon, c'est encore HS mais voici une ancienne conversation :
    Les données sont sauvegarder a la fermeture de ton QFile. Tu peux/Il faut le fermer avec cette fonction:
    file.close();
    Si tu veux enregistrer tes données sans fermer ton fichier tu peux utiliser la fonction flush comme l'a dit refracto
    file.flush();
    Du coup si tu écris et que tu lis juste après sans avoir fermé le fichier ?
  • @lambe021 :
    Un OS - quel qu'il soit j'espère ! - affecte à un processus le même buffer en lecture et en écriture, de sorte que lorsque le process écrit (il le fait dans le buffer) et qu'il lit juste après (il le fait depuis le buffer) eh bien il trouve ses données, qu'elles soient passées par le fichier ou pas encore.
    Même conclusion si les opérations ne sont pas bufferisées : le process écrit dans le fichier, et quand il lit le fichier, forcément il y trouve les octets qu'il a écrits.

    @FlaMMe34 :
    Tu es certain
    - qu'il n'y a pas plusieurs threads ?
    - que tu n'utilises pas un pointeur avarié quelque part ?
  • Je n'ai pas vraiment d'idée, mais je remarque juste que tu te cognes à une erreur de type violation de mémoire : ce n'est pas rien, c'est même un gros plantage, du genre de celui qu'on obtient avec un pointeur moisi, alors que si tu essayes juste d'écrire dans un fichier déjà fermé ou en lecture seule ou au-delà de la fin du fichier la punition est bien moins lourde.
    Exemple : je viens d'essayer de supprimer
    - un fichier encore ouvert
    - un fichier en lecture seule
    - un fichier qui n'existe pas
    QFile::remove ("fichier") me retourne juste 'false' et le code continue.
    mon remove du fichier ne génère pas l'exception mais me renvoi juste false. je me suis peut être mal expliqué, mais c'est un Mon plantage est sur la ligne :
     flux << "1vv10.0" << endl;   // ligne du crash
    @FlaMMe34 :
    Tu es certain
    - qu'il n'y a pas plusieurs threads ?
    - que tu n'utilises pas un pointeur avarié quelque part ?
    Mon application est Multithread mais l'utilisation du fichier temporaire est uniquement au sein d'un meme thread.
    concernant le pointeur avarié, je me dis que c'est possible vu le message d'erreur, mais je ne voit pas trop bien ou
  • 22 Mar modifié
    rebonjour , si flux est un QDataStream,et que tu utilises le constructeur avec QIODevice(QFile),ton QFile(QIODevice) est il bien ouvert avec le mode ReadWrite ?
  • 22 Mar modifié
    en gros si tu veux ecrire dans flux(QDataStream) il faut avoir ouvert ton QFile en mode ReadWrite (ou WriteOnly)
  • Bonjour,

    si le problème persiste et si ton code n'est pas confidentiel, peut être pourrais tu poster le projet pour que l'on puisse l'essayer.

    Moi je dis ça... je dis rien.
Connectez-vous ou Inscrivez-vous pour répondre.