在多线程中查看全局变量

时间:2014-07-29 14:44:32

标签: python multithreading

我有一个gui按钮来启动一个循环,另一个按钮来停止循环。我使用全局变量 - 运行循环。 1到循环,0到停止循环。以下是我正在使用的代码。

import pygtk
pygtk require('2.0')
import gtk
import threading
import time

run = 0
mythread = ""

class daqGui:
    def start_program(self):
        global run
        print ("start program")
        i = 0
        while run:
            print ("Count = %s\n" % i)
            i += 1
            time.sleep(2)

    def start_run(self, widget):
        global run
        global mythread
        run = 1
        mythread = threading.Thread(target=self.start_program, args=())
        mythread.start()

    def stop_run:
        global run
        print("Halt loop")
        run = 0

     def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.connect("delete_event", self.delete_event)
        self.window.set_border_width(10)
        self.window.set_size_request(600,400)

        table = gtk.Table(10, 6, True)
        self.window.add(table)

        run_button = gtk.Button("Start Run")
        run_button.connect("clicked", self.start_run)
        run_button.set_size_request(100,30)
        table.attach(run_button, 0, 1, 0, 1, False, False, xpadding=0, ypaddig=0)
        run_button.show()

        stop_button = gtk.Button("Halt Run")
        stop_button.connect("clicked", self.stop_run)
        stop_button.set_size_request(100,30)
        table.attach(stop_button, 2, 3, 0, 1, False, False, xpadding=0, ypaddig=0)
        stop_button.show()

def main():
    gtk.main()

if __name__=="__main__":
    daqGui()
    main()   

运行此代码时会发生什么,单击“开始”按钮,您将看到程序显示i = 1,i = 2,依此类推。点击停止按钮,程序不会停止。退出gui,循环仍然继续。你必须杀死进程才能阻止它。我究竟做错了什么??谢谢!

1 个答案:

答案 0 :(得分:0)

全局变量是粗略的多线程代码,尤其是GUI。

以下代码启动" clock"每秒输出一次的线程。

两秒后,第二个线程设置stop_event标志,该标志在两个线程之间共享。

当时钟线程检查事件对象时,它会看到它已被标记,因此循环退出。通常情况下,事件尚未设置,因此等待1.0秒然后重新运行循环。

import threading, time

def display_clock(event):
    while not event.wait(1):
        print 'now:',time.strftime('%X')
    print("stop_event set")

def stop_clock(event):
    time.sleep(3)
    event.set()

def main():
    stop_event = threading.Event()

    threading.Thread(
        target=display_clock, args=[stop_event],
    ).start()

    threading.Thread(
        target=stop_clock, args=[stop_event],
    ).start()

    # wait for all threads to die
    for th in threading.enumerate():
        if th != threading.current_thread():
            th.join()

if __name__ == "__main__":
    main()

输出

now: 15:17:16
now: 15:17:17
now: 15:17:18
stop_event set