Je crée un keyevent qui si j'appuie sur la touche "A" fera la fonction A(). Le processus de A() durera 2s. Je veux attendre jusqu'à ce que chaque processus fini si j'appuie sur la touche si rapidement juste comme 4times/2s. J'ai testé et trouvé que si j'appuie sur la touche dans 4times/2s, il fera d'abord le processus dans les événements de pression plus tard. Comment puis-je attendre jusqu'à ce que tous les processus finis dans keyevents? Je dois essayer d'utiliser le fil et le mutex. Mais quelque chose ne va pas. C'est la première fois que j'utilise mutex. Je ne sais pas comment résoudre ce problème.Comment puis-je attendre jusqu'à ce que chaque processus terminé dans keyevents dans Qt?
int g = 0;
void MainWindow::keyPressEvent(QKeyEvent *event)
{
int keyCode = event->key();
if(keyCode == Qt::Key_A) {
qDebug() << "da";
a->start();
}
}
void MyThread::run()// i try to block the second time process while press the key so quickly
{
mutex->lock();
...//process:last for 2s
g++;
mutex->unlock();
}
Quel est votre fil de fer supposé faire?Je ne vois pas pourquoi auriez-vous besoin d'un fil pour cela. Maintenez simplement un compteur de processus démarrés. Utilisez le signal ['QProcess :: finished'] (http://doc.qt.io/qt-5/qprocess.html#finished) pour être informé lorsqu'un processus est terminé. Décrémenter le compteur lorsque vous recevez un tel signal. Lorsque le compteur atteint 0, vous saurez que tous les processus sont terminés. Bien que je ne vois pas quel est le point dans tout cela. Il serait utile que vous expliquiez un peu votre programme. – thuga
J'ai mis à jour le code. Par exemple, je veux mettre à jour la valeur de g après 2s processus dans A(). Cependant, si j'appuie sur la touche si rapidement, il ne mettra pas à jour le g et ne recevra pas le nouvel événement clé et exécutera à nouveau l'exécution de A() à partir de la première ligne. Donc je veux définir un mutex pour empêcher un nouvel événement de venir et s'assurer qu'il peut passer par le A() et mettre à jour g.Mais le code ne fonctionne pas –
Pourquoi voulez-vous mettre à jour 'g' deux secondes après avoir démarré un processus? Pourquoi ne peut-il pas être mis à jour immédiatement? Vous devriez expliquer plus en détail ce que vous essayez d'accomplir, parce que, pour le moment, cela n'a aucun sens. Si vous voulez bloquer un keyevent pendant qu'un processus est en cours d'exécution, vérifiez simplement l'état du processus (http://doc.qt.io/qt-5/qprocess.html#state) dans votre keyevent. – thuga