Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python线程_Python_Multithreading_Python Multithreading - Fatal编程技术网

Python线程

Python线程,python,multithreading,python-multithreading,Python,Multithreading,Python Multithreading,我试图创建一个简单的程序,它使用套接字等待一个文件,然后将该文件的输出返回到另一个线程上的文本字段 我做了一些研究,我知道线程的基本原理是如何工作的,但我不明白多个线程如何相互连接 我的问题是,WindowManager.addText函数仅在WindowManager类本身发生事件时更新,而不是从ConnectionManager类更新。如何解决此问题,以便每次在另一个线程上调用WindowManager.addText时,它都会立即得到更新 我得到了一个WindowManager类,它将一个

我试图创建一个简单的程序,它使用套接字等待一个文件,然后将该文件的输出返回到另一个线程上的文本字段

我做了一些研究,我知道线程的基本原理是如何工作的,但我不明白多个线程如何相互连接

我的问题是,
WindowManager.addText
函数仅在
WindowManager
类本身发生事件时更新,而不是从
ConnectionManager
类更新。如何解决此问题,以便每次在另一个线程上调用
WindowManager.addText
时,它都会立即得到更新

我得到了一个
WindowManager
类,它将一个字符串保存到一个文本字段(用GTK加载):

现在我还得到了一个
ConnectionManager
类,它加载连接线程:

class ConnectionManager:
    def __init__(self, windowManager):
        self.ping = PingThread(windowManager)
        self.ping.setDaemon(True)
        self.ping.start()
最后我得到了
PingThread
类,它是实际的连接线程,在这个例子中,我随机调用线程:

class PingThread(threading.Thread):
    def __init__(self,  window, group=None, target=None, name=None, verbose=None):
        threading.Thread.__init__(self, group=group, target=target, name=name, verbose=verbose)
        self.window = window

    def run(self):
        while True:
            self.window.addText("Test")
            time.sleep(random.randrange(1,10))

在对堆栈溢出进行了一些搜索之后,我找到了答案。我所需要做的就是初始化线程,方法是将它放在代码的开头:
GObject.threads\u init()

搜索堆栈溢出后,我找到了答案。我所需要做的就是在代码的开头初始化线程:
GObject.threads\u init()。GUI线程应该侦听
PingThread
创建的队列。您能进一步解释一下吗?因为我真的不明白你的意思。据我所知,GUI现在位于另一个线程,即主线程上。它是,但是
PingThread
正在尝试使用
self.window.addText(“Test”)
访问主线程(
WindowManager
)中的GUI。这就是问题所在。是的,我已经有一种感觉,那就是问题所在,但是我如何才能推送消息呢?就像我说的那样,使用队列。我真的不知道如何在GTK中做到这一点,这就是为什么我留下了评论而不是答案。在Tkinter中,我经常使用
Queue
stdlib模块执行此操作。我不明白为什么这在这里不起作用,但GTK可能有自己的约定。你永远不想在非GUI线程中做GUI的事情。GUI线程应该侦听
PingThread
创建的队列。您能进一步解释一下吗?因为我真的不明白你的意思。据我所知,GUI现在位于另一个线程,即主线程上。它是,但是
PingThread
正在尝试使用
self.window.addText(“Test”)
访问主线程(
WindowManager
)中的GUI。这就是问题所在。是的,我已经有一种感觉,那就是问题所在,但是我如何才能推送消息呢?就像我说的那样,使用队列。我真的不知道如何在GTK中做到这一点,这就是为什么我留下了评论而不是答案。在Tkinter中,我经常使用
Queue
stdlib模块执行此操作。我不明白为什么这在这里不起作用,但GTK可能有自己的惯例。
class PingThread(threading.Thread):
    def __init__(self,  window, group=None, target=None, name=None, verbose=None):
        threading.Thread.__init__(self, group=group, target=target, name=name, verbose=verbose)
        self.window = window

    def run(self):
        while True:
            self.window.addText("Test")
            time.sleep(random.randrange(1,10))