我在python中遇到了一个关于多线程的问题。基本上在我的软件中,我有一个运行成本高的功能。因此,我把它用于子线程。但是,在函数运行期间,它将调用函数并更改对象的某些值,这将触发GUI更改。因此,我需要把它放回到mainthread。
问题是我需要等待这个函数在主线程中完全完成,然后在子线程中继续执行该函数。
因此,我需要一种聪明的方法将作业发送回主线程并等待它完成。有人可以给我任何建议怎么做?
非常感谢。我在下面添加了我正在运行的线程方法
最诚挚的问候,
import Queue
import logging
import sys
import time
import threading
DISABLE_THREADING = False
queue = Queue.Queue()
def run_in_sub_thread_named(name, function, *params):
if DISABLE_THREADING:
return function(*params)
th = _DEThread(function, *params)
task_info = TaskInfo(name)
th.task_info = task_info
running_tasks[th] = task_info
th.start()
return th
def run_in_main_thread(function, *params, **kwargs):
cur_thread = threading.currentThread()
cur_thread_name = cur_thread.getName()
in_main_thread = (cur_thread_name == 'MainThread')
if in_main_thread:
function(*params, **kwargs)
else:
queue.put((function, params, kwargs))
class _DEThread:
def __init__(self, function, *params):
self.thread = threading.Thread(target=self.execute)
self.thread.setDaemon(True)
self.function = function
self.params = params
self.name = ''
def start(self):
self.thread.start()
def execute(self):
try:
if self.params is ():
res = self.function()
else:
res = self.function(*self.params)
except:
run_in_main_thread(self._update_task_info,
'Exception: %s' % repr(sys.exc_info()))
raise
run_in_main_thread(self._update_task_info, res)
def _update_task_info(self, res):
if self in running_tasks:
task_info = running_tasks[self]
task_info.end_time = time.time()
task_info.result = res
finished_tasks[self] = task_info
del running_tasks[self]
答案 0 :(得分:3)
通常,在Qt中调用线程之间的函数的方法是使用信号和插槽。您还可以使用QMetaObject.invokeMethod
在另一个线程中调用函数,并使用Qt.BlockingQueuedConnection
类型强制它阻塞线程,直到主线程函数完成。但是,您需要使用QThreads
而不是python threads
。请查看QThread
文档中描述的工作人员模式,了解如何重构代码以使用QThreads
def function_in_thread(self):
# This will block the thread until function completes
# in main thread.
QtCore.QMetaObject.invokeMethod(self.main_gui, 'nameOfMethod', QtCore.Qt.BlockingQueuedConnection)