1

スレッドクラスにデータを転送したいのですが、何が悪いのかわかりません。以下のコードはこの質問からのものであり、私はそれを少し変更しました。

これはコードです:

import gtk, gobject, threading, time

gobject.threads_init()

class T(threading.Thread):
    pause = threading.Event()
    stop = False

    def start(self, data, *args):
        super(T, self).start()

    def run(self, data):
        while not self.stop:
            self.pause.wait()
            gobject.idle_add(lambda *a : self.rungui(data))
            time.sleep(0.1)

    def rungui(self, data):
        print "printed"
        print data

thread = T()

class Start:

        def toggle_thread(self, data=None, *args):
                if not thread.is_alive():
                    thread.start(data)
                    thread.pause.set()
                    self.button.set_label('Pause Thread')
                    return

                if thread.pause.is_set():
                    thread.pause.clear()
                    self.button.set_label('Resume Thread')
                else:
                    thread.pause.set()
                    self.button.set_label('Pause Thread')

        def __init__(self):
                thread = T()
                window = gtk.Window()
                self.button = gtk.ToggleButton('Start Thread')
                data = 3
                self.button.connect('toggled', lambda *a : self.start(data), None)
                window.add(self.button)
                self.button.show()
                window.show()

        def start(self, data=None):
                self.toggle_thread(data)

        def main(self):
                gtk.main()

if __name__ == "__main__":
        start = Start()
        start.main()

スレッドを完全に機能させるには、何を修正する必要がありますか?

4

1 に答える 1

0

GUIスレッドからGTKを操作しないでください。それについて:

gobject.idle_add(self.rungui)

リンクの例は正常に機能しますが、終了するにはsystemkillコマンドが必要です。そして、super()はrun()関数に引数をもたらすことができません。

私のスレッドの初期化は次のようになります。

class VirtService(threading.Thread):
        def __init__(self, queue):
                threading.Thread.__init__(self)
                self.queue = queue

        def thread_loop(self):
                while self.queue.qsize():
                        data_command = self.queue_get()

...

queue = Queue()

if __name__ == '__main__':
        gobject.threads_init()
        vs = VirtService(queue)

また、キューを使用して両方向へのデータ変換を行うことができます。コマンドにキューを使用することもできます。非グラフィカルスレッドでは、Queue.qet()を介してc ++ poll()アナログを作成し、guiスレッドではqueue.put()を作成します。

于 2012-11-15T14:55:45.467 に答える