Manière la plus simple pour PyQT Threading
J'ai une interface graphique en PyQt avec une fonction addImage(image_path)
. Facile à imaginer, il est appelé lorsqu'une nouvelle image devrait être ajouté dans un QListWidget. Pour la détection de nouvelles images dans un dossier, j'utilise un threading.Thread
avec watchdog
pour détecter les modifications de fichiers dans le dossier, et ce thread appelle ensuite addImage
directement.
Cela donne l'avertissement que QPixmap
ne devraient pas être appelée de l'extérieur de la thread gui, pour des raisons de sécurité des threads.
Quelle est la meilleure et la plus simple façon de faire ce thread-safe? QThread? Signal /Slot? QMetaObject.invokeMethod? J'ai seulement besoin de passer une chaîne de caractères à partir du fil à addImage
.
OriginalL'auteur user3696412 | 2016-05-16
Vous devez vous connecter pour publier un commentaire.
Je crois que la meilleure approche est d'utiliser le signal/slot mécanisme. Ici est un exemple. (Note: voir la MODIFIER ci-dessous qui met en évidence une éventuelle faiblesse de ma démarche).
Dans votre interface code de l'application, vous devez créer le nouveau Thread, lui donner le droit de la fonction de rappel, et le faire fonctionner.
MODIFIER
M. three_pineapples et M. Brendan Abel a souligné une faiblesse dans ma démarche. En effet, l'approche fonctionne bien pour ce cas particulier, parce que vous générez /émettent le signal directement. Lorsque vous traitez avec construit-dans Qt signaux sur les boutons et widgets, vous devez prendre une autre approche (comme spécifié dans la réponse de M. Brendan Abel).
M. three_pineapples conseillé de moi pour commencer un nouveau sujet sur StackOverflow, pour faire une comparaison entre plusieurs approches de thread-safe de la communication avec une interface graphique. Je vais creuser la question, et de le faire demain 🙂
Vous êtes les bienvenus. Je suis heureux que cela vous a aidé 🙂
J'ai rencontré ce problème qu'aujourd'hui. Moi aussi, j'ai consulté ma GUI dans un thread façon dangereuse. Ma demande s'est écrasé lamentablement, sans les rapports d'erreur: stackoverflow.com/questions/37242849/... Ensuite, j'ai utilisé le rapport signal/slot mécanisme comme je l'ai indiqué dans ma réponse. Il m'a aidé. Je suis content que ça vous aide à vous aussi 🙂
Qui downvoted cette réponse, sans laisser un commentaire? 🙁 S'il vous plaît laissez un commentaire pour expliquer pourquoi cette réponse n'est pas bonne, avant de faire le downvote.
Je suis une personne raisonnable. Toute personne qui croit que ma réponse n'est pas bonne, peut juste me dire pourquoi, et je ferai de mon mieux pour faire les changements appropriés. Mais juste downvoting sans aucune explication n'aide pas n'importe qui. S'il vous plaît..
OriginalL'auteur K.Mulier
Vous devez utiliser le construit en
QThread
fournis par Qt. Vous pouvez placer votre fichier de code de contrôle à l'intérieur d'un travailleur classe qui hérite deQObject
afin qu'il puisse utiliser l'intervalle Qt Signal/Slot système pour transmettre des messages entre les threads.QThread
au lieu dethreading.Thread
? Semble être à peu près le même code.La différence, c'est que c'est la manière canonique d'utiliser des threads dans Qt/PyQt -- mon exemple est fondamentalement le même que le Modèle de Travailleur décrite dans la documentation officielle. Il est aussi généralement déconseillée à émettre des signaux sur d'autres objets de l'extérieur de ces objets, dont l'autre réponse ne et le fonctionnaire travailleur modèle ne fonctionne pas.
Salut Brendan @Brendan Abel, Pouvez-vous préciser: "C'est aussi généralement déconseillée à émettre des signaux sur d'autres objets de l'extérieur de ces objets, dont l'autre réponse ne et le fonctionnaire travailleur modèle qui ne fonctionne pas"? Je suis intéressé pour en savoir plus à ce sujet. Parce que je utiliser le signal / slot mécanisme de beaucoup de choses dans ma plus récente de l'application. Merci beaucoup 🙂
En interne, Qt Signaux sont mis en œuvre comme fonctions membres protégés. Ainsi, alors que ce que vous ne pouvez travailler dans cet exemple (parce que le signal a été créé en python), il ne fonctionne pas comme une solution générale (ie. il ne sera généralement pas le travail avec le groupe builtin Qt signaux sur les boutons et widgets).
Qu'est ce qu'une "fonction membre protégé"?
OriginalL'auteur Brendan Abel