2013-04-19 4 views
0

Я создаю интерфейс python для запуска программы на C, и мне нужно знать, успешно ли завершилась эта программа на C, но единственный способ, которым я это знаю, блокирует интерфейс, пока программа C не закончена. Кто-нибудь знает, как я могу это сделать, не блокируя интерфейс?Как узнать, завершился ли процесс без блокировки GUI?

Ниже приведен фрагмент кода:

def runProg(self): 
    """This funcion will run the simulation""" 

    if self.openned.get() == 1: 
     self.pid = StringVar() 
     a = open(self.nameFile.get(),"w") 
     self.writeFile() 

     self.process = subprocess.Popen([self.cmdSys.get()+self.dV.get()+ 
             self.extension.get(),self.nameFile.get()]) 
     self.pid = self.process.pid 

     #isso trava a interface para processos muito grandes até que o mesmo tenha terminado 
     if self.process.wait() == 0: 
      tkMessageBox.showinfo("","Your simulation was completed sucessfully.") 

ответ

0

От модуля подпроцесс documentation:

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False) 

Выполните команду описывается арг. Дождитесь завершения команды, а затем верните атрибут returncode.

subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False) 

Запустить команду с аргументами. Дождитесь завершения команды. Если код возврата равен нулю, тогда верните, иначе повысите CalledProcessError. Объект CalledProcessError будет иметь код возврата в атрибуте returncode.

Таким образом, я бы использовал либо subprocess.call(), либо subprocess.check_call() функцию, которая была введена subprocess.Popen().

1

Звонок self.process.wait() блокируется до тех пор, пока подпроцесс не завершится, но, как вы обнаружили, если вы вызываете его в главном потоке графического интерфейса, это не позволит графическому интерфейсу обрабатывать больше событий до тех пор, пока это не произойдет.

Вместо этого вы можете просто проверить, закончилось ли оно self.process.poll(), которое немедленно вернет None, если процесс все еще запущен.

Однако вам нужно будет настроить какое-то временное событие для мониторинга подпроцесса, если вы хотите, чтобы что-то произошло, когда оно было сделано.

Другой вариант - запустить подпроцесс в фоновом потоке и вместо этого использовать метод блокировки wait(). См. this question.

0

Подпроцесс Popen класс имеет атрибут, который код возврата, в соответствии с pydoc:

Нет Значение указывает, что процесс еще не завершен. Отрицательное значение -N указывает, что дочерний элемент был прерван сигналом N (только для UNIX).

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