L'exécution d'un processus distinct ou d'un thread dans Qt
Je suis en train d'écrire mon premier bon logiciel. Partie, il sera donner à l'utilisateur l'affichage d'une image, et choisir de l'accepter ou de la rejeter. Ce faisant, il entraînera l'image d'être enregistré pour un acceptées ou rejetées dossier, et éventuellement une rotation et/ou redimensionnées.
En ce moment, mon pivoter//redimensionner à l'opération d'enregistrement est suspendu l'exécution de mon programme, mais j'aimerais qu'il se passera dans le fond de sorte que l'image suivante s'affiche instantanément.
Est le seul moyen de le faire dans Qt pour le traitement de l'image dans un thread séparé, ou est-il un autre moyen? Je suis encore en train de ma tête ronde C++ et Qt, donc je ne veux pas confondre me suis plongée dans un nouveau champ!
OriginalL'auteur Skilldrick | 2009-05-28
Vous devez vous connecter pour publier un commentaire.
Qt est le support des threads. Vous pourriez trouver cet exemple d'application intéressant, car il est un peu similaire à ce que vous décrivez.
Aussi, ici, c'est la pleine Qt fil de la documentation.
Les Threads sont la bonne réponse et Qt est le support des threads est assez bonne. Si c'était moi je venais d'apprendre par l'exemple. L'application liée est similaire en ce qu'il effectue une tâche en arrière-plan et permet d'être averti quand il est fait. Prendre un exemple qui est intéressant ou pertinent pour vous et essayez-le vous-même. Rechercher des choses que vous ne comprenez pas dans les docs jusqu'à ce que le processus dans son ensemble est plus clair. Habituellement, vous aurez de là où vous devez aller.
Attention, il n'y est une fuite de mémoire dans l'exemple! L'objet thread n'est jamais supprimé. Et pourquoi font-ils protéger l'écrire opertion de m_abort et pas l'opération de lecture?! Pourquoi protéger de toute façon, la pire chose qui puisse arriver, c'est qu'il y a une boucle supplémentaire de traitement.
OriginalL'auteur Naaff
ce genre de tâches sont parfaitement adaptés pour les threads. encore, vous devez d'abord faire un "normal" fonction qui ne fait que ça, et quand ça marche ajouter un thread qui lit une file d'attente et des appels la même fonction de traitement.
Qt a un grand nombre d'outils pour vous aider sur ce, principalement du fait que la plupart des conteneurs sont thread-safe, et aussi un couple de filetage algorithmes (comme réduire la carte). encore, essayez d'abord de manière synchrone.
OriginalL'auteur Javier
Édité
Désolé les gars, j'ai un moment très difficile de relier la "file d'Attente de Type Personnalisé Exemple" les conditions.
Aussi loin que je peux dire de la question, une fois que l'utilisateur a accepté ou rejeté à l'image qu'il doit être en option rotation et/ou une mise à l'échelle et toujours enregistrés dans un répertoire spécifique et passer à l'image suivante. (-> pas d'interaction avec l'utilisateur)
Même si l'utilisateur quitte la boîte de dialogue de l'image doit encore être sauvé.
La "file d'Attente de Type Personnalisé Exemple des" poignées en une seule image, est toujours lié à l'interface graphique et lorsque les utilisateurs de sortie de la boîte de dialogue le thread de l'opération est interrompue.
Donc, si il commence son programme à partir de la file d'Attente exemple il va probablement commencer l'écriture d'un mutex image protégée de la file d'attente, donc il peut ajouter de nouvelles images à la liste si il y a de l'attente des opérations de sauvegarde. Sinon, l'utilisateur a encore à attendre sur les opérations en cours.
Le deuxième problème est qu'il n'a probablement pas envie d'attendre sur l'attente d'enregistrer les opérations lorsque la boîte de dialogue se ferme.
Ce que je voudrais faire pour répondre aux exigences de travail avec le pool de threads. Alimenter le pool de threads les opérations de sauvegarde que vous voulez et utiliser un décorateur modèle basé sur QRunnable si il doit également être mis en rotation/mise à l'échelle. Toutes les files d'attente est gérée correctement par la bibliothèque et les opérations en cours sont exécutées même si l'utilisateur quitte la boîte de dialogue.
À la fin, je serait peut-être utiliser la file d'Attente un code d'exemple pour charger de nouvelles images et de donner à l'utilisateur une attente indication pour l'opération de chargement.
Mon runnables et décorateur serait probablement ressembler à ceci ... (peut-être quelques autres constructeurs pour remplacer les fonctions de jeu), donc je peux très facile d'ajouter de nouveaux opération comme celle-ci
QThreadPool::globalInstance()->start(saver );
sans utilisation d'un faible niveau de la synchronisation de l'objet.OriginalL'auteur TimW
De créer un thread séparé avec
QThread
ou de l'utilisation de pool de threads les threads de travail avecQRunnable
ou de prendre un coup d'oeil à haut niveau QtConcurrent classe. Ici est un exemple pour l'échelle de l'image.OriginalL'auteur bkausbk
Façon la plus simple de le faire est d'utiliser QtConcurrent::run
OriginalL'auteur Jeka