如何在Python/wxPython中对线程任务排序
相对而言,wxPython和线程是新手,因此比较混乱 我有5个“步骤”必须对目标数据执行。这些步骤必须按给定顺序依次执行 为了保持GUI的响应性,我将每个步骤编码为一个单独的线程 当我手动完成该过程时(使用按钮启动每个步骤),我可以看到每个步骤在完成时更新显示 我不知道如何按顺序自动调用每个线程。如果我要创建一个标记为“一行完成所有5个步骤”的按钮,按钮调用的代码会是什么样子 我尝试过按顺序调用每个线程方法,但它们都试图同时对数据进行操作。每个线程都使用一个“with”和一个threading.Lock()来防止其他线程在给定线程运行时访问数据,但这些线程似乎没有以正确的顺序执行 正确的写作方法是什么 调用_thread1()如何在Python/wxPython中对线程任务排序,python,wxpython,Python,Wxpython,相对而言,wxPython和线程是新手,因此比较混乱 我有5个“步骤”必须对目标数据执行。这些步骤必须按给定顺序依次执行 为了保持GUI的响应性,我将每个步骤编码为一个单独的线程 当我手动完成该过程时(使用按钮启动每个步骤),我可以看到每个步骤在完成时更新显示 我不知道如何按顺序自动调用每个线程。如果我要创建一个标记为“一行完成所有5个步骤”的按钮,按钮调用的代码会是什么样子 我尝试过按顺序调用每个线程方法,但它们都试图同时对数据进行操作。每个线程都使用一个“with”和一个threading.
调用_thread2()
调用_thread3()
……等等
它将始终按照给定的顺序执行线程,并且只有在每个线程完成后才不会阻塞wx?将gui中的等待步骤成员作为列表和线程完成处理程序,如果有下一个任务,它将从列表中弹出并启动线程 在
\uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
在OnDoAllClicked(self,evt)
:
在检查下一个任务(自身)
:
在每个线程中:
while not Done:
# Do whatever
wx.CallAfter(callbacK)
让gui的等待步骤成员作为列表和线程完成处理程序,如果有下一个任务,它将从列表中弹出并启动线程
在\uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
在OnDoAllClicked(self,evt)
:
在检查下一个任务(自身)
:
在每个线程中:
while not Done:
# Do whatever
wx.CallAfter(callbacK)
我想我会采取不同的方法。我将调用一个线程,其中包含五个函数中的每一个。然后线程可以按顺序调用每个函数,当每个函数返回时,它可以使用GUI的线程安全方法(wx.CallAfter、wx.PostEvent)之一向GUI发送更新
以下是有关wxPython和线程的更多信息的两个参考资料:
我想我会采用另一种方法。我将调用一个线程,其中包含五个函数中的每一个。然后线程可以按顺序调用每个函数,当每个函数返回时,它可以使用GUI的线程安全方法(wx.CallAfter、wx.PostEvent)之一向GUI发送更新
以下是有关wxPython和线程的更多信息的两个参考资料:
这是个好主意……也许是我最后做这件事的方式。有时我想在调用下一个线程之前在中间做一些其他的事情…或者调用一个无序的线程。我相信你可以使用几个可选参数,或者按照你想要的顺序列出选项。这是一个好主意…可能是我最后做这件事的方式。有时我想在调用下一个线程之前在中间做一些其他的事情…或者按顺序调用一个线程。我相信您可以使用几个可选参数,或者按照您希望的顺序列出选项。这就是我的想法,但是我该如何编写代码呢?我如何优雅地告诉GUI“在这里等待,直到最后一个线程完成,但仍然在正常循环中处理GUI内容?一个带有wx.Yield()、time.sleep()的while循环在它里面?上面添加的示例代码-您甚至可以在CheckNextTask开始时启用所有按钮,并在每次调用开始时禁用相应的按钮。\u thread这就是我的想法,但我该如何编写它?我如何优雅地告诉GUI“在这里等待,直到最后一个线程完成,但仍然在正常循环中处理GUI内容?一个while循环,里面有一个wx.Yield(),time.sleep()?上面添加的示例代码-您甚至可以在checknextask开始时启用所有按钮,并在每个调用开始时禁用相应的按钮。\u thread在
wx
调用的wx.lib.delayedresult
中还有一个非常方便的启动线程库。函数startWorker
接受两个参数,工作线程函数和在工作线程完成后调用的使用者函数。还有一个非常方便的库,用于在wx
中启动线程,名为wx.lib.delayedresult
。函数startWorker
接受两个参数,辅助线程函数和消费函数,在辅助线程函数完成后调用。
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)