我有一个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,循环仍然继续。你必须杀死进程才能阻止它。我究竟做错了什么??谢谢!
答案 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