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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    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.