Bonjour:
Mon but c'est de tuer un thread qui interagit avec des variables d'une fenêtre tkinter. Dans mon vrai programme, ce thread lit la température du CPU et asservi d'autre threads (de multiprocessing cette fois) qui sont charger de faire chauffer le CPU
jusqu’au la température de consigne. Cela permet à l'utilisateur d'entrer la température à partir de laquelle l'ordinateur devient bruyant. Suite à ça, un autre programme se bridera de façon à ne pas excéder cette température, en effet, la nuit l'ordinateur fait du potain si il tourne à fond.
Avec cette technique, j'aimerai pouvoir le faire travailler au maximum sans pour autant qu'il fasse de bruit... Voila pour le contexte.
Après réduction à un code minimal cela donne:
Je pense avoir identifié le problème mais je ne sais pas comment le résoudre. Je m'explique:
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 import tkinter import threading class MonThread(threading.Thread): def __init__(self, var): threading.Thread.__init__(self) self.var = var self.sucide = False def run(self): while not self.sucide: self.var.get() def quit(): thread.sucide = True # thread.join(timeout=0) fenetre.quit() fenetre = tkinter.Tk() tkinter.Button(text="quit", command=quit).pack() var = tkinter.StringVar() thread = MonThread(var) thread.start() fenetre.mainloop()
au moment du '.mainloop', j'imagine qu'un thread est lancé car il est en écoute des éventements.
quand un éventement se produit, se thread 's'arrette' ou du-moins pose un verrou car il se fige. (Ce que je veux dire c'est que par exemple si un bouton exécute une fonction un peu longue, la fenêtre ne réagit plus à rien tant que la fonction n'a pas retournée.)
Ducoup, dans cet exemple, quand on appel quit, tout devient inaccessible, dont la variable 'var'. le programme se bloc donc a la ligne 'self.var.get()' qui doit attendre un verrou qui ne sera pas libéré avant de sortir de 'quit()'...
Ce n'est qu'une supposition et c'est peu être complètement faux ce que je raconte![]()
J'ai essayé le .join(timeout=0) mais c'est sans succès.
Je me suis dit que lancer la fonction 'quit' dans un autre thread pourrait résoudre le problème car la fenêtre principale ne serai pas verrouillé, mais je ne sais pas trop comment mettre ça en place et ça me parait bien compliqué...
Est-ce que le problème est bien celui que j'imagine? Il y -t-il un moyen d'y remédier?
Partager