LINUX.ORG.RU

[pyGTK] Избежать блокировки интерфейса.


0

0

Здравствуйте, уважаемые знатоки! В процессе освоения pyGTK и написания программы на нем возникла следующая проблема:

Есть кнопка, к нажатию на которую привязана функция: button.connect("clicked", my_funct).

Эта функция вызывает другую (скачивание и парсинг html-файла), которая работает некоторое время. На это время и зависает весь интерфейс программы (что, в принципе, логично - он ждет завершения функции my_funct), но это мне совсем не нравится (впрочем, мне, если честно, - все равно, я знаю, что моя программа работает, а вот пользователям, особенно "по ту сторону кроссплатформенности", это вряд ли понравится). Можно ли это "зависание" как-нибудь обойти, не прибегая к многопоточности? Если нет, то где можно найти "красивый" прием применения многопоточности в подобном случае?

Заранее спасибо!

Re: [pyGTK] Избежать блокировки интерфейса.

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

wfrr ★★☆ ()

Re: [pyGTK] Избежать блокировки интерфейса.

делается это многопоточностью.

Можешь периодически вызывать аналог дельфятного Application.ProcessMessages(), но это криво.

Legioner ★★★★★ ()

Re: [pyGTK] Избежать блокировки интерфейса.

Спасибо, так и пытаюсь делать, но тогда возникают еще одно уточнение и вопрос:

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

2) Как завершать поток? thread.join() в функции my_funct() бессмысленно, а по gobject.timeout_add() работает отвратительно медленно...

DiGital ()

Re: [pyGTK] Избежать блокировки интерфейса.

Есть еще отчаянно-функциональный метод - использовать корутины. Видел в инете фреймворки для питона и pygtk. Ну это так, если с тредами не хочется возиться...

anonymous ()
Ответ на: Re: [pyGTK] Избежать блокировки интерфейса. от DiGital

Re: [pyGTK] Избежать блокировки интерфейса.

Не очень понял что вы хотите в 1), но возможно Queue то, что вам нужно: http://docs.python.org/lib/module-Queue.html

2) Если thread.isAlive() и thread.join() не подходят, то можно в Queue положить, скажем, None или Condition использовать: http://docs.python.org/lib/condition-objects.html

Вообще, про потоки в питоне можно много чего почитать, например: http://heather.cs.ucdavis.edu/~matloff/Python/PyThreads.pdf
ну и далее в гугле.

anonymous ()

Re: [pyGTK] Избежать блокировки интерфейса.

Можно, это, обойти, не прибегая к многопоточности. Насколько я понимаю, больше всего вешает программу именно скачивание html-файла. А для этого есть GIOChannel (или вообще что-то свое).

ShprotX ()
Ответ на: Re: [pyGTK] Избежать блокировки интерфейса. от ShprotX

Re: [pyGTK] Избежать блокировки интерфейса.

Всем спасибо за участие! Уже, вроде бы, разобрался. Сделал переключалку между двумя процессами (интермордой и подпрограммой скачивания и парсинга), чтобы они работали по-очереди. В связи с этим возник вопрос: неужели интерпретатор питона не умеет распределять процессорное время между потоками программы, т.е. выполнять один поток и при получении, например, клика по кнопке переключаться на поток, который контролирует эту самую кнопку?

DiGital ()
Ответ на: Re: [pyGTK] Избежать блокировки интерфейса. от DiGital

Re: [pyGTK] Избежать блокировки интерфейса.

> неужели интерпретатор питона не умеет распределять процессорное время между потоками программы, т.е. выполнять один поток и при получении, например, клика по кнопке переключаться на поток, который контролирует эту самую кнопку?

Корректировочка:

"неужели мну не умеет распределять процессорное время между потоками программы, т.е. выполнять один поток и при получении, например, клика по кнопке переключаться на поток, который контролирует эту самую кнопку?"

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