如何在Python / wxPython中对线程化任务进行排序

时间:2013-11-26 21:03:04

标签: python wxpython

相对较新的wxPython和线程,因此混乱。

我必须对目标数据执行5个“步骤”。必须按给定顺序依次执行这些步骤。

为了保持GUI响应,我将每个步骤编码为一个单独的线程。

当我手动完成整个过程(使用按钮开始每一步)时,我可以看完每个步骤,在完成后更新显示。

我迷失了如何按顺序自动调用每个线程。如果我要创建一个标记为“连续执行所有5个步骤”的按钮,按钮调用的代码会是什么样的?

我尝试过按顺序调用每个线程方法,但它们都尝试一次对数据进行操作。每个线程使用'with'和threading.Lock()来防止其他线程在给定线程运行时访问数据,但线程似乎没有以正确的顺序执行。

的正确方法是什么

call_thread1()
call_thread2()
call_thread3()
..等

总是以给定的顺序执行线程,并且只在每个线程完成后才会阻塞wx?

2 个答案:

答案 0 :(得分:2)

将gui的等待步骤成员作为列表和线程完成处理程序,如果有下一个任务将其从列表中弹出并启动该线程。

__init__(self) :

   self.TaskList = []

OnDoAllClicked(self, evt)

   self.TaskList.extend([call_thread1, call_thread2, call_thread3, etc])
   CheckNextTask()

CheckNextTask(self)

   if len(self.TaskList) > 0:
      current = self.TaskList[0]
      del self.TaskList[0]
      current(callback=self.CheckNextTask)

在每个帖子中:

   while not Done:
      # Do whatever
   wx.CallAfter(callbacK)

答案 1 :(得分:2)

我想我会采用不同的方法。我会调用一个包含五个函数中的每一个的单个线程。然后该线程可以按顺序调用每个函数,当每个函数返回时,它可以使用GUI的一个线程安全方法(wx.CallAfter,wx.PostEvent)向GUI发送更新。

以下是有关wxPython和线程的更多信息的几个资源: