![]() |
Модераторы: ginnie |
![]() ![]() ![]() |
|
alezzz |
|
|||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: нет Всего: 14 |
Нужно сделать GUI для одной программы, выбрал Tkx. Вобщем примерно такой код:
Есть кнопка "Старт", которая делает $run=1 и кнопка "Стоп", которая делает $run=0. Функция loop периодичекси смотрит $run == 1, и если true то начинает что-то делать, и вот это что-то может затянуться на минуты (а может и часы) и все это время функция забирает весь процесс на себя, никакую кнопку не нажать, все выводы внутри функции в текстовые поля не отображаются пока не отработает функция. Как сделать правильно? И желательно без fork. Нет ли какой функции чтоб на время отдать управление MainLoop и потом продолжить дальше? И может кто знает ссылку на хорошую документацию по Tkx. Это сообщение отредактировал(а) alezzz - 19.5.2011, 21:23 |
|||
|
||||
Pfailed |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 1 Всего: 39 |
А что делает эта функция? Какие-то вычисления или операции ввода-вывода? Если первое, то по хорошему нужен отдельный поток/процесс для неё. Со вторым Tk должен справиться без ветвлений.
|
|||
|
||||
alezzz |
|
|||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: нет Всего: 14 |
Все начальные данные поступают из entry и text. Сама функция занимается скорее вычислениями, а если точнее через LWP::UserAgent отправляет запросы, много. Скорость работы функции также зависит от скорости интернет. Есть несколько вложеных циклов (for, while), вызовы других функций. Попробовал заменить циклы условиями, которые срабатывают по определеннолму значению переменной, но все настолько запутано получается, к тому-же приходится подгонять имеющийся код вместо написания нового... вобщем жуть.
А вот с процессами проблема, делается под Windows, пробовал я раньше сделать fork под windows, чот-то не получилось. |
|||
|
||||
Pfailed |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 1 Всего: 39 |
LWP::UserAgent это ни что инное, как операции ввода-вывода по сети. Соответственно потоки и процессы тут не нужны.
Все задержки сводятся к ожиданию прихода данных от удаленной стороны. Если чуть углубиться, то происходят блокировки при чтении из сокетов, когда данных в сокете еще нет. В Tk есть средства позволяющие осуществлять неблокирующий ввод-вывод. Просто просим Tk чтобы он уведомил нас когда данные станут доступны для чтения. Таким образом программа наша больше не блокируется. В этом и есть суть событийно ориентированного подхода. Получили событие - отреагировали. Будь то нажатие кнопки или приход данных по сети. Все это хорошо, но есть и минусы. Логика программы сильно усложняется: нужно писать кучу коллбэков и передавать между ними данные. Как я вижу у вас тут есть несколько путей: 1. Обойтись Net::HTTP::NB и возможностями Tk. 2. Посмотреть на событийные машины которые дружат с Tk и имеют уже готовый http клиент. Насколько знаю AnyEvent и POE могут подойти 3. Ознакомиться с модулем Coro и Coro::LWP Первый вариант самый аскетичный, большинство работы нужно проделать вручную. Второй вариант более прост в реализации, но придётся сперва разобраться в этих самых событийных машинах (AnyEvent мне показался проще). Третий вариант на мой взгляд самый простой. Интерфейс Coro во многом похож на интерфейс модуля threads. И стиль написания кода здесь уже привычный, а не событийно ориентированный. Получится даже воспользоваться LWP::UserAgent. Мой восторг по поводу Coro можно прочитать в одной из тем Плохо то, что вы работает в windows. Кто знает на какие грабли придётся наступить, ведь сокеты в windows весьма спецефичны. |
|||
|
||||
alezzz |
|
|||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: нет Всего: 14 |
Pfailed, спасибо, попробую сначала Coro, посмотрю что получится.
|
|||
|
||||
Pfailed |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 1 Всего: 39 |
С Coro это действительно очень просто. Ниже пример: кнопка по прежнему реагирует на нажатие в то время как LWP качает большой файл. Работает ли на Windows?
|
|||
|
||||
alezzz |
|
|||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: нет Всего: 14 |
||||
|
||||
Pfailed |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 1 Всего: 39 |
Когда отказывает ppm может помочь cpan: http://forum.vingrad.ru/index.php?showtopi...t&p=2334231
|
|||
|
||||
alezzz |
|
|||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: нет Всего: 14 |
на *nix да, на windows не все так просто:
Это сообщение отредактировал(а) alezzz - 20.5.2011, 13:45 |
|||
|
||||
Pfailed |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 1 Всего: 39 |
Что мешает сделать cl алиасом gcc?
Добавлено через 4 минуты и 16 секунд А что у вас с ppm? Тут написано, что на 32 битной всё работает: http://code.activestate.com/ppm/Coro/ |
|||
|
||||
alezzz |
|
|||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: нет Всего: 14 |
Незнаю, с ppm ничего не делал. Кроме перла ничего другого нет, gcc тоже надо поискать. Такое с ppm вообще бывает редко, кроме Coro кажется был только один такой-же случай, только не помню уже с каким модулем.
|
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: нет Всего: 18 |
Windows XP mingw perl 5.10 Добавлено через 3 минуты и 38 секунд 1. Для этого качаете mingw и устанавливаете его. после установки вам нужно добавить его в PATH. 2. Cкачиваете dmake. Разархивируете его куда нибудь и добавляете эту папку в PATH 3.Скачиваете модуль ExtUtils-FakeConfig и устанавливаете его. |
|||
|
||||
Pfailed |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 1 Всего: 39 |
Один фиг мой пример в винде не завёлся, у меня по крайней мере. Почему-то LWP не хочет качать а параллель.
|
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: нет Всего: 18 |
значит нет компимлятора |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: GUI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |