使用win32ui DDE模块进行Python线程处理

时间:2013-09-18 13:21:19

标签: python multithreading python-2.7 dde

修改 显然,这比我想象的更深;我只是试图在正在运行的线程中创建服务器,但没有用。

运行Python2.7 32位Windows。似乎dde模块(或者我使用它的方式?)不能很好地与线程一起使用。

这是用于演示的简化代码:

本作品:

import win32ui
import dde
import threading

class Conversation(threading.Thread):
    def __init__(self, server, first, second, tag)
        threading.Thread.__init__(self)
        self.tag = tag #string
        self.first = first #string
        self.second = second #string
        self.server = server #dde server object

        self.conversation = dde.CreateConversation(server)

        #The focus of the problem. Here it works.
        self.conversation.ConnectTo(self.first, self.second)

    def run(self):
        print ""

def main():
    machine = "Irrelevant_MachineName"
    tag = "Irrelevant_Tagname"
    server = dde.CreateServer()
    server.Create("Irrelevant_ServerName")

    t = Conversation(server, "Irrelevant_Name", machine, tag)
    t.start()


main()    

这不是:

class Conversation(threading.Thread):
    def __init__(self, server, first, second, tag):
        threading.Thread.__init__(self)
        self.tag = tag #string
        self.first = first #string
        self.second = second #string
        self.server = server #dde server object

    def run(self):
        self.conversation = dde.CreateConversation(server)

        #Focus of problem.
        #Inside here it does not work.
        self.conversation.ConnectTo(self.name1, self.name2)

def main():
    machine = "Irrelevant_MachineName"
    tag = "Irrelevant_Tagname"
    server = dde.CreateServer()
    server.Create("Irrelevant_ServerName")

    t = Conversation(server, "Irrelevant_Name", machine, tag)
    t.start()


main()

当它失败时,我收到此错误:

Exception in thread Thread-1:
Traceback (most recent call last):
    File "c:\Python27\lib\threading.py", line 808, in __bootstrap_inner
     self.run()
    File "DDE.py", line 28 in run
     self.conversation.ConnectTo(self.first, self.second)
error: ConnectTo failed

为什么会这样?这将是我的第一个多线程程序,所以我不确定我在这里做些蠢事。

但对我而言,我应该能够在线程模块的“run()”方法中调用dde.server.conversation对象的ConnectTo方法,这似乎是完全合理的。

我考虑过多处理,但我不认为这适用于我的情况。

那么,有什么想法吗?我非常感谢帮助!!!

修改 在“threading.Thread。 init (self)”中添加了失败和后续示例。仍然没有骰子。

编辑2

另外,我听说过tcl dde库的故事,但不知道在哪里可以找到它。如果有人可以在python中为我提供访问它的方法,那么我将永远为你负债。

1 个答案:

答案 0 :(得分:2)

所以看来,对于Windows DDE,你只能在线程本身内部使用ConnectTo的实例。它确实支持多线程,当你的run仍在你的类中时,DDE可能会将其视为你的初始线程之外。不知道这实际上是一个答案,但在我看来,如果你的第一个代码块正在运行,那么这个错误完全有可能只是Windows DDE和多线程的特性。