Индикатор выполнения, не обновляющий во время операции

Вы можете настроить логику разрешения, поместив ее в метод boot вашего RouteServiceProvider:

Route::bind('post', function ($id) {
    return App\Post::active()->find($id) ?? abort(404);
});
7
задан Ali Afshar 3 February 2009 в 02:53
поделиться

5 ответов

Я собираюсь заключить PyGTK FAQ в кавычки:

Вы создали индикатор выполнения в окне, затем Вы начинаете выполнять цикл, который делает некоторую работу:

while work_left:
    ...do something...
    progressbar.set_fraction(...)

Вы заметите, что окно даже не обнаруживается, или если оно делает индикатор выполнения, остается замороженным до конца задачи. Объяснение просто: gtk управляем событиями, и Вы крадете управление далеко от gtk основного цикла, таким образом препятствование тому, чтобы это обработало нормальный GUI, обновляет события.

Простое решение состоит при временном возвращении управления к gtk каждый раз, когда прогресс изменяется:

while work_left:
    ...do something...
    progressbar.set_fraction(...)
    while gtk.events_pending():
        gtk.main_iteration()

Заметьте, что с этим решением, пользователь не может выйти из приложения (gtk.main_quit, не работал бы из-за нового цикла [gtk.main_iteration ()]), пока Ваш heavy_work не сделан.

Другое решение состоит при использовании gtk неактивные функции, которые вызваны gtk основным циклом каждый раз, когда этому нечего делать. Поэтому gtk сознает ситуацию, и неактивная функция должна сделать немного работы. Это должно возвратить True, если существует больше работы, которая будет сделана, иначе Ложь.

На лучшее решение (это не имеет никаких недостатков) указал James Henstridge. Это использует в своих интересах генераторы Python как неактивные функции, чтобы заставить Python автоматически сохранить состояние для нас. Это идет как это:

def my_task(data):
    ...some work...
    while heavy_work_needed:
        ...do heavy work here...
        progress_label.set_text(data) # here we update parts of UI
        # there's more work, return True
        yield True
    # no more work, return False
    yield False

def on_start_my_task_button_click(data):
    task = my_task(data)
    gobject.idle_add(task.next)

'В то время как' выше просто пример. Единственные правила состоят в том, что это должно уступить Верный после выполнения небольшого количества работы и существует больше работы, чтобы сделать, и это должно привести ко Лжи, когда задача сделана.

13
ответ дан 6 December 2019 в 15:32
поделиться

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

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

1
ответ дан 6 December 2019 в 15:32
поделиться

В Python 2.x целочисленные операнды приводят к целочисленному делению. Попробуйте это:

#Callback function invoked when download/upload has progress
def progress(download_t, download_d, upload_t, upload_d):
    print 'in fileupload progress'
    mainwin.mainw.prog_bar.set_fraction(float(upload_d) / upload_t)
0
ответ дан 6 December 2019 в 15:32
поделиться

Да, Вам, вероятно, нужны параллелизм и да, потоки являются одним подходом, но если Вы действительно используете потоки, используйте метод как этот: http://unpythonic.blogspot.com/2007/08/using-threads-in-pygtk.html, который абстрагирует далеко боль и позволит Вам фокусироваться на важных аспектах.

(Я не повторил все в том сообщении в блоге через лень, следовательно общественная Wiki).

0
ответ дан 6 December 2019 в 15:32
поделиться

Одна опция, если Вы не женаты на pycurl, состоит в том, чтобы использовать наблюдателей GOBJECT IO.

http://pygtk.org/pygtk2reference/gobject-functions.html#function-gobject--io-add-watch

Используя это можно чередовать загрузку файла с нормальным циклом событий PyGTK и даже сделать вызов set_progress в обратном вызове часов IO. При разгрузке всей работы для загрузки на pycurl, это не действительно выполнимо, но если Вы просто загрузите файл по HTTP, io_add_watch сделает использование сокета для этого намного менее болезненным также.

0
ответ дан 6 December 2019 в 15:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: