LINUX.ORG.RU

Как задать индикатор выполнения процесса

 


0

2

Уважаемые форумчане. Имеется файл с индикатором процесса. Хочу, чтобы пока процесс выполняется пользователь видел как бегает полоска. С индикатором все норм, он работает. Но он должен открываться в качестве формы из главной программы по нажатию кнопки, т.е. нажимаю на кнопку и должна отобразиться форма с индикатором:

pb = pb_form()
pb.setGeometry(850, 400, 300, 100)
pb.setWindowTitle("Форма c индикатором")         
pb.show()

Запускаем процесс:

proc = subprocess.Popen(.....

Дожидаемся, пока выполнится

while proc.poll() is None:
           time.sleep(0.5)
          
print(proc.returncode)

Ну и далее, если код «0 (то есть процесс завершился без ошибок)», то закрываем форму с индикатором

Но на деле после нажатия кнопки сразу же запускается процесс, а форма с индикатором вылазит только после его завершения. Странно, в теории написано, что subprocess не блокирует главную программу



Последнее исправление: cdi1989 (всего исправлений: 3)

Так ты же ждешь потом окончание процесса. Если без while то получится то, что ты хочешь. Выноси тогда проверку завершилась ли команда в отдельный поток. А вообще показывай лучше полный скрипт - мне, например, не совсем понятно где ты там вызываешь свою форму с индикатором.

alozovskoy ★★★★★
()
Ответ на: комментарий от alozovskoy

Если без while, то print(proc.returncode) сразу выводит None, а процесс идет себе дальше. нужно чтобы, код возвращался, только после завершения процесса, а я не пойму как это сделать

cdi1989
() автор топика
Ответ на: комментарий от alozovskoy

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

cdi1989
() автор топика
Ответ на: комментарий от cdi1989

Что тебе непонятно в этой фразе?

А вообще показывай лучше полный скрипт

Тебе неоднократно говорили, что по твоим обрывкам кода в общем случае нифига не понятно.

shrub ★★★★★
()

Popen.poll()

Check if child process has terminated.

anonymous
()
Ответ на: комментарий от cdi1989

Тебе нужно вытащить в отдельные потоку функции, которые проверяют процесс и функции, которые меняют индикатор. Если тебе не требуется показать процесс выполнения то проще в качестве индикатора использовать что-то вроде ['.', 'o', 'O', 'o'] - в цикле проверяешь процесс, если еще жив - берешь следующий элемент из списка (как это сделано, скажем, в aptitude при решении конфликтов) - вроде и пользователь видит что что-то происходит, и в то же время у тебя все в один поток выполняется, как все закончилось - показываешь return code.

Вообще я смотрю ты неделю уже ковыряешь этот скрипт, при том что знаний у тебя не хватает - если это не just for fun то лучше сходи в job, там тебе быстро сделают все что нужно.

alozovskoy ★★★★★
()
Ответ на: комментарий от shrub

while proc.poll() is None: time.sleep(0.5)

Тебе неоднократно говорили, что по твоим обрывкам кода в общем случае нифига не понятно.

Лол, что тут непонятного? Он тебе на чистом питоне честно пишет: «все очень плохо».

t184256 ★★★★★
()
Ответ на: комментарий от cdi1989

а можно, как-то по простому сделать, чтобы главный не блокировался

А что, в питоне разве нет асинхронности?

ambiguousnick
()
Ответ на: комментарий от cdi1989

Я пистон не знаю, но это типичный кейз в JS. Должен быть какой то асинхронный цикл, типо setInterval(function(){if(condition) doStaff}), ищи аналог в питоне. Хотя, это вообще то, считается плохим паттерном. Надо это все оформлять либо колбеками, либо, промисами/генераторами.

ambiguousnick
()
Ответ на: комментарий от alozovskoy

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

alozovskoy ★★★★★
()
Ответ на: комментарий от alozovskoy

как он может менять состояние индикатора в while-цикле, если цикл блокирует единственный поток, и ничего кроме цикла в момнт исполнения цикла не выполняется?

ambiguousnick
()
Ответ на: комментарий от alozovskoy

Создание отдельного потока помогло.

cdi1989
() автор топика
Ответ на: комментарий от alozovskoy

Я незнаю как в qt, но в gtk есть функция, которую можно дергать в таком цикле и она будет обновлять индикатор(и прочее отрисовывать, что изменилось).

pawnhearts ★★★★★
()

Какой вайл вообще может быть в гуе? Ты чего? И окошечки эти выскакивающие тоже лучше убери. Бесят. Лучше как на ютубе сделай баранку крутящуюся. Точно. Или кино показывай во время ожидания ну или хотя бы гифку смешную.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.