0

我正在为我学校的公共驱动器创建一个即时通讯程序。除了小细节,我什么都有。在下面的代码中,它检查来自朋友的新消息并打印他们发送的最后一条消息。如果没有消息,它会这样说。问题是当它移动到代码的下一步时,它会等待用户输入。在您输入之前,它不会让您收到更多消息,因为程序停止读取和搜索 while 循环并被输入语句捕获。我想知道是否有使输入语句可选的方法。说它不需要输入,但如果有输入,它会发送它并做它的事情。我似乎无法找到使输入语句可选的方法。任何想法或工作代码将不胜感激。如果您需要整个代码,我可以将其发送给您或发布它。这是唯一对这个问题真正重要的代码。

        LastMessage = ""
        while Message:

            Path = "Message"+SendTo+"-"+UserName+".txt"

            if path.isfile(Path):

                LoadMessage = open(Path, "rb")
                NewMessage = pickle.load(LoadMessage)
                LoadMessage.close()

            else:
                NewMessage = "Sorry, No messages found"   

            if LastMessage != NewMessage:

                LastMessage = NewMessage
                print(NewMessage)
                print("")

            SendMessage = raw_input()  #--- This is where it gets caught up! ---

            Save = open("Message"+UserName+"-"+SendTo+".txt", "wb")
            pickle.dump(SendMessage, Save)
            Save.close()
4

2 回答 2

0

在我看来,您有两个主要选择:

  1. 同时输入和检查(各种选项,例如搜索threadingmultiprocessing从标准库中搜索);或者
  2. 带有超时和循环的输入(参见例如如何在 raw_input 上设置时间限制)。
于 2013-12-12T23:36:52.067 回答
0

所以听起来你想同时做两件不同的事情——寻找用户的输入并轮询来自其他用户的新消息。Jonrsharpe 将线程作为解决此问题的首选方法,我同意这是最直接的方法。你需要做的是这样的:

    import threading

    class InputMessageThread(threading.Thread):
        def run(self):
            SendMessage = raw_input()  # This thread will hang here for input but thats 
                                       # OK as original thread will keep going
            Save = open("Message"+UserName+"-"+SendTo+".txt", "wb")
            pickle.dump(SendMessage, Save)
            Save.close()

    inputthread = InputMessageThread()
    inputthread.start()

    # rest of your code here

虽然你可能想看看其他一些问题。例如,如果我了解您要正确执行的操作,您将拥有一个文件,其中包含从源用户到目标用户的消息。但是,如果源用户在处理此文件之前发送第二条消息,则第一条消息将被覆盖。在实践中,您可能永远不会看到这一点,但在您允许写入下一个之前,进行某种握手以确保消息已实际发送将是一种更强大的方法。

于 2013-12-13T00:13:53.063 回答