Forum Programmation.c++ [Projet logiciel scan] Problème de timing et traitement de données

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
1
29
jan.
2018

Bonjour à tous,

J'ai développé un projet de scan pour une imprimante avec QtCreator et QtDesigner.

Mon interface graphique est mon objet mainwindow, je lance mes commandes par l'objet com_periph.

Je rencontre un problème de crash ou de non traitement des données lors d'une action de scan.

Mon problème principale est que je ne connais pas la fréquence de répétition du signal readyReadStandardOutput() présent dans la boucle while.

De ce fait, j'ai peur que le traitement fait en slot ne soit pas assez rapide avant qu'un autre signal/slot soit créé pour la deuxième fois.

Avez-vous déjà rencontré ce problème et comment faire pour le résoudre ! ?

Voici le code associé :

communication_peripherique.cpp :

void communication_peripherique::scan(QStringList list_argu,QString nameoffile){

    //QProcess process;
    process = new QProcess(); // obligation pour utiliser process dans mainwindow
    process->start("scanimage",list_argu);
    process->setReadChannel(QProcess::StandardOutput);
    process->setReadChannel(QProcess::StandardError);

    //connect(&pingProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readData()));

    //cout << process->processId() << endl;

    while(process->waitForReadyRead())
    {
        //qDebug() << process->readAllStandardOutput();
        emit readyReadStandardOutput();
        //qDebug() << process->readAll();

    }
    process->waitForFinished(-1); // 10s

    scan_output.append(process->readAllStandardOutput());

    // Output the data
    qDebug("Done!");
    QFile file(nameoffile);
    file.open(QIODevice::WriteOnly);
    file.write(scan_output);
    file.close();

    process->close();

    //RESET
    scan_output.clear();
}

mainwindow.cpp :

    void MainWindow::scan_maj_progression() {

        scan_progression.append(com_periph->process->readAllStandardError());

        //output example
    //    "Progress: 33.1%\rProgress: 33.2%\rProgress: 33.3%\rProgress: 33.4%\r"
    //    "33.4"
    //    ""
    //    ""

        index=0;
        index_1=0;
        max=0;
        min=0;

        if (scan_progression.isEmpty() == false) {

            for (index=0; index < scan_progression.size(); index++){
                if (scan_progression.at(index) == ' ') {min=index;}

                if (scan_progression.at(index) == '%') {max=index;}
            }

            for (index_1=0; index_1 < scan_progression.size(); index_1++){
                if (index_1 > min && index_1 < max) {
                    scan_progression_1.append(scan_progression.at(index_1));
                }
            }

            //
            test = scan_progression_1.lastIndexOf(QChar('.'));
            scan_progression_2 = scan_progression_1.left(test);

            progress = scan_progression_2.toInt(&ok,10);

            //qDebug() << progress;

            ui->scan_progression->setValue(progress);
        }

        scan_progression.clear();
        scan_progression_1.clear();
        scan_progression_2.clear();
    }

mainwindow.h :

        QByteArray scan_progression;
        QString scan_progression_1;
        QString scan_progression_2;

        int index = 0;
        int index_1 = 0;

        int progress=0;

        int min =0;
        int max =0;

        int test;

        bool ok;

Si vous avez des idées n'hésitez pas.

Merci par avance.

  • # Mode debug

    Posté par  . Évalué à 2.

    As tu essayé de reproduire ton crash en mode debug, cela te permettrait de voir ce qu'il se passe en positionnant des breakpoint au bon endroit

    Sinon tes variables n'ont pas un nom très parlant : par ex : process -> oui je me doute que c'est un process vu que c'est un QProcess (idem pour file/qfile : c'est quoi ? L'image que produit ton scan? dans ce cas pourquoi ne pas l'appeler outputScanner ou quelque chose de similaire), mais que fait il exactement ?

    Et tu mélanges le snake_case (ton code perso) avec du camelCase (Qt et C++ généralement). Perso j'aime bien le code homogène.

    • [^] # Re: Mode debug

      Posté par  . Évalué à 1.

      Avec des points d'arrêts, qu'est-ce que je peux voir d'avantage ?

      Il faut pointer vers ce que je scrute non ?

      • [^] # Re: Mode debug

        Posté par  . Évalué à 1.

        tu peux mettre un point d'arrêt juste avant l'endroit où tu penses que ça crash et ensuite faire du pas à pas,
        ca te permettrait de confirmer que ca vient de là.

        Après il est clair que ca peut être plus compliqué si le bug n'est pas systématique, arrive tu a le reproduire ?

        As tu un message quand ca crash ?

        • [^] # Re: Mode debug

          Posté par  . Évalué à 1.

          Maintenant je n'ai plus de crash mais une action de scan sur X, la barre de progression ne redémarre pas à zéro !

          En théorie avec les qDebug(), ça devrait le faire pour le debug !

          Je ne sais pas si je peux faire du pas à pas car je lance un scan, le scan étant lancé, je ne peux pas mettre des points d'arrêt une fois la process lancé.

          • [^] # Re: Mode debug

            Posté par  . Évalué à 2.

            Les breakpoint te permettent de voir l'état de chaque variale et de voir leur évolution en mode pas à pas.

            Y a deux truc bizarre :
            Tu n'utilise pas waitForStarted après avoir appeler start comme recommandé par la doc qt(http://doc.qt.io/qt-5/qprocess.html#setReadChannel)

            Tu set deux fois la channel, pour moi tu ne peux avoir qu'une channel de configuré à la fois
            Pour t'en convaincre fait un qdebug de readChannel.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.