4 votes

wxPython multithreading matplotlib plot PAS dans le thread principal

Ce que je veux faire :

  1. Exécuter TCPServer dans un fil de discussion
  2. Obtenir des données "Recevoir de la prise"
  3. Mettre à jour le tracé et afficher les données

Ce que j'ai fait avec succès :

  1. Un cadre avec wxPython a un bouton,
  2. cliquez sur le bouton démarrer la prise
  3. Réception des données du socket

Le problème :

  1. Lorsque j'essaie d'appeler la fonction de traçage à partir du thread TCPServer, je reçois cette erreur

    "PyAssertionError: C++ assertion "wxThread::IsMain()" failed at ..\..\src\common\timercmn.cpp(66)
    in wxTimerBase::Start(): timer can only be started from the main thread "

Le code :

  1. Principal, où je commence le fil

    def start_socket(self):
    
        HOST = ''
        PORT_A = 6340
        self.server_A = ThreadedTCPServer((HOST, PORT_A), ThreadedTCPRequestHandler)
        self.server_temp = self.server_A
        self.server_A_thread = threading.Thread(target=self.server_A.serve_forever)
        self.server_A_thread.setDaemon(True)
        self.server_A_thread.start()
  2. Le fil, où j'essaie de comploter :

    class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
        def handle(self):
            self.Main =  Main(None, -1, '')
            self.data = self.request.recv(1024).strip()
            print "%s wrote: " % self.client_address[0]
            print self.data
            plt.ion()    
            self.fig = plt.figure(1)
            print self.image_scale
            ax = self.fig.add_subplot(111)
            self.image_scale = ([1,2], [ 4,10 ] )
            cax = plt.imshow(self.image_scale, cmap='Greys', interpolation='nearest' )
            draw()

Avec le débogage, l'erreur provient de cette ligne :

self.fig = plt.figure(1)

Error:  "timer can only be started from the main thread"

Donc, je ne suis pas sûr, mais je pense que je dois faire le traçage dans la fonction principale de wx.Frame. Y a-t-il une solution qui permette de garder le programme normal en cours d'exécution, et de permettre le traçage en temps réel dans un autre thread ? En particulier, j'ai l'intention de créer plus d'un thread TCPServer.

Merci d'avance, votre aide sera très appréciée.

-3voto

Hasan Points 125

Merci quand même, j'ai résolu le problème, et je fais tourner le timer depuis différents fils maintenant,

Sa limitation dans la langue, avec une solution de contournement, il fonctionne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X