2017-03-31 2 views
-1

J'ai de lourdes tâches. J'ai créé QProgressBar pour afficher que le programme fonctionne encore et a exécuté une lourde tâche dans un autre thread en utilisant la classe C++ std :: thread. Mais QProgressBar ne fonctionne pas, seule la fenêtre avec QProgressBar démarre. Voici le code:QProgressBar et tâche lourde

QProgressBar progress; 
progress.setRange(0, 0); 
progress.show(); 
if (keyLength == 1024) 
    std::thread(&RSA::generateKeys, &rsa, RSA::RSA_1024).join(); 
else if (keyLength == 2048) 
    std::thread(&RSA::generateKeys, &rsa, RSA::RSA_2048).join(); 

Voici le résultat: enter image description here

+2

Et, où est le code, qui signale la barre de progression sur le statut modifié? Pourquoi définissez-vous votre barre de progression à l'état indéterminé, au lieu de définir des valeurs min/max valides, et de le signaler lorsque la valeur actuelle change? –

+0

il devrait fonctionner et fonctionner sans valeur min et max, comme ceci http://doc.qt.io/qt-5/images/macintosh-progressbar.png – van9petryk

+1

S'il vous plaît élaborer sur _how_ pensez-vous qu'il fait cela? Comment devrait-il courir à travers 0-100% de la longueur de la barre de progression, dans le laps de temps correct, sans aucune sorte de signaux sur l'état mis à jour? –

Répondre

0

Ce n'est pas comment les choses sont faites. :) Here vous pouvez voir un exemple que j'ai fait qui utilise le modèle de travail (un thread séparé qui traite une tâche lourde et rend compte à l'interface utilisateur). Voici comment mon application recherche:

enter image description here

J'utilise QThread (thread de travail qui contient un objet qui gère le traitement) et je ne peux que vous recommander de faire la même chose. Vous pouvez également sous-classer QThread et remplacer la méthode run() en fonction de ce dont vous avez réellement besoin, mais c'est rarement le cas. PS: Comme alternative, vous pouvez utiliser QRunnable (très utile pour les tâches effectuées de temps à autre qui ne nécessitent pas de thread séparé à gérer tout le temps). Le problème avec QRunnable est qu'il ne sous-classe pas QObject ce qui signifie que vous ne pouvez pas utiliser le mécanisme de signal de fente pour rapporter à l'interface utilisateur. Bien sûr, vous pouvez changer cela, mais cela va à l'encontre de l'objectif du runnable qui est destiné à être une solution très légère.

+0

Je ne comprends pas, pourquoi je ne peux pas utiliser le fil de C++ pour cette tâche? Je ne veux pas signaler, combien de tâches j'ai fait, je veux seulement signaler l'utilisateur, cette tâche est encore en train de résoudre. – van9petryk

+0

D'après ce que je comprends, vous voulez que la barre de progression indique à quel point la tâche (dans le thread séparé) a été effectuée, n'est-ce pas? Rendre compte à l'interface utilisateur vous oblige à utiliser des signaux et pour cela 'QThread' est le chemin à parcourir. – rbaleksandar

+0

@rbaleksandar Un QThread est un handle de thread. Tout comme vous ne modifieriez pas une classe de gestionnaire de fichiers, vous ne devriez pas modifier QThread en en dérivant. Si vous voulez des signaux, dérivez de 'QObject', ou renoncez aux signaux et aux appels de file d'attente directement aux récepteurs, [style GCD] (http://stackoverflow.com/a/21653558/1329652). Vous pouvez émettre des signaux ou des appels de file d'attente depuis n'importe quel thread. QThread n'est pas spécial à cet égard. –