2015-12-16 2 views
1

[PROBLEM] Я хочу остановить поток, который вызывает функцию.Как остановить поток в wxpython?

[КОД]

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() 

[ТЕКУЩИЙ] Ничего не произойдет, если нажать на кнопку "Стоп".

[DESIRED] Функция «testFunction» должна остановиться, если я нажму кнопку «Стоп».

ответ

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() 
+0

Я понимаю вашу точку зрения. моя цель - остановить функцию, когда я нажимаю на stop btn. другими словами, если функция имеет в общей сложности 5 шагов, и я нажимаю «Остановить», когда функция находится на шаге 3, тогда шаг 4 больше не должен выполняться. – george

+0

Затем вам нужно добавить '' break' или 'continue' после каждого шага. – tglaria

+0

[plus1], потому что я слишком ленился, чтобы посмотреть, как лучше всего вырваться из цикла '' while'': D – nepix32

1

Если вы хотите получить более тонкую детализацию в своей нити, вы должны это реализовать. Используйте что-то вроде этого, разделив различные этапы в инструкции генератора с помощью инструкции yield:

def testFunction(event): 
    def inner_gen(): 
     print ('win','r') 
     time.sleep (0.5) 
     yield 
     print ('abc') 
     time.sleep (0.5) 
     yield 
     print ('enter') 
     time.sleep (0.5) 
     yield 
     print 'sleep' 
     time.sleep (3) 
     yield 

    while True: 
     for _ in range(2): 
      for _ in inner_gen(): 
       if shutdown_event.is_set(): 
        shutdown_event.clear() 
        return 
+0

Мне это понравилось: D – tglaria

Смежные вопросы