2013-12-12 4 views
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() 
+0

Если я правильно понимаю, вы хотите иметь возможность печатать новые сообщения и получать данные от пользователя одновременно? Почему бы не использовать Threads? – Lazybeem

ответ

0

У вас есть два основных варианта, как я это вижу:

  1. Одновременный ввод и проверка (различные варианты, поиск, например, threading или multiprocessing из стандартной библиотеки); или
  2. Вход с таймаутом и петлей (см., например, How to set time limit on raw_input).
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 

Пока вы на него, хотя вы можете захотеть взглянуть на некоторые другие вопросы. Например, если я понимаю, что вы пытаетесь сделать правильно, у вас будет файл, содержащий сообщение от пользователя-источника для конечного пользователя. Но если исходный пользователь отправляет второе сообщение до того, как этот файл будет обработан, первое сообщение будет перезаписано. На практике вы никогда не увидите этого, но какое-то рукопожатие, чтобы убедиться, что сообщение действительно отправлено до того, как вы разрешите, чтобы следующее было написано, было бы более надежным подходом.

+0

Я планирую добавить еще несколько функций для решения этой проблемы. Я подумал, что это тоже проблема. Я думал, что создаю список для каждого человека. Список будет списком сообщений. Он будет читать количество элементов в списке и добавить 1 при создании нового сообщения. Я подумал, что это лучший способ позаботиться об этой проблеме. В любом случае, спасибо за код, я с нетерпением жду, если он будет работать, как я надеюсь.^_ ^ – user3097485

 Смежные вопросы

  • Нет связанных вопросов^_^