如何在wxpython中停止线程?

时间:2015-12-16 10:33:00

标签: python multithreading wxpython wxwidgets

[问题] 我想停止调用函数的线程。

[CODE]

import wx
app = wx.App(redirect=False)
top = wx.Frame(None)
sizer = wx.GridBagSizer()
import threading
shutdown_event = threading.Event()
def testFunction(event):
    while not shutdown_event.is_set():
        import time
        for i in range(2):
            print ('win','r')
            time.sleep (0.5)
            print ('abc')
            time.sleep (0.5)
            print ('enter')
            time.sleep (0.5)
            print 'sleep'
            time.sleep (3)


def startThread(event):
    import threading
    th = threading.Thread(target=testFunction, args=(event,))
    th.start()


def stopThread(event):
    shutdown_event.set()



addButton = wx.Button( top, -1, "Start", style=wx.BU_EXACTFIT )
sizer.Add(addButton, (6, 8), (2, 14), wx.EXPAND)
stopButton = wx.Button( top, -1, "Stop", style=wx.BU_EXACTFIT )
sizer.Add(stopButton, (8, 9), (2, 14), wx.EXPAND)
top.Bind(wx.EVT_BUTTON, startThread, addButton)
top.Bind(wx.EVT_BUTTON, stopThread, stopButton)
top.Sizer = sizer
top.Sizer.Fit(top)
top.Show()
app.MainLoop()

[CURRENT] 如果我点击“停止”按钮,没有任何反应。

[DESIRED] 如果单击“停止”按钮,函数“testFunction”应该停止。

2 个答案:

答案 0 :(得分:1)

是的它正在停止,问题是它没有被中断,它在脚本的两次迭代完成之前一直在运行,然后检查while condition,然后停止。

import wx
app = wx.App(redirect=False)
top = wx.Frame(None)
sizer = wx.GridBagSizer()
import threading
shutdown_event = threading.Event()
def testFunction(event):
    while not shutdown_event.is_set():
        import time
        for i in range(2):
            print u"Iteración {}".format(i)
            if shutdown_event.is_set():
                break;
            print ('win','r')
            time.sleep (0.1)
            if shutdown_event.is_set():
                break;
            print ('abc')
            time.sleep (0.1)
            if shutdown_event.is_set():
                break;
            print ('enter')
            time.sleep (0.1)
            if shutdown_event.is_set():
                break;
            print 'sleep'
            time.sleep (0.5)
        print u"Fin de ejecución\n\n"
    print u"Se detuvo la ejecución.\n\n"


def startThread(event):
    import threading
    th = threading.Thread(target=testFunction, args=(event,))
    th.start()


def stopThread(event):
    shutdown_event.set()


addButton = wx.Button( top, -1, "Start", style=wx.BU_EXACTFIT )
sizer.Add(addButton, (6, 8), (2, 14), wx.EXPAND)
stopButton = wx.Button( top, -1, "Stop", style=wx.BU_EXACTFIT )
sizer.Add(stopButton, (8, 9), (2, 14), wx.EXPAND)
top.Bind(wx.EVT_BUTTON, startThread, addButton)
top.Bind(wx.EVT_BUTTON, stopThread, stopButton)
top.Sizer = sizer
top.Sizer.Fit(top)
top.Show()
app.MainLoop()

答案 1 :(得分:1)

如果你想在你的线程中拥有更精细的粒度,你必须实现它。使用类似的东西,使用<script> $(document).ready(function() { <?php echo $hide_div ?>; // DECODE JSON IN JS var selected_array = $.parseJSON(<?php echo json_encode ($product_category_selected) ?>); $.each(selected_array(key, value) { $("#" + value).prop("checked", true); }); }); </script> 语句将生成器语句中的不同步骤分开:

yield