Как лучше сделать индикатор прогресса для долгой операции?
Как лучше сделать индикатор прогресса для долгой операции?
Добрый день,
У меня плагин Panel, она умеет скачивать файл с удаленного сервера по своему протоколу. Процесс долгий, хочется показывать прогресс.
Я пока что вижу один вариант: создать диалог, взять его handle и из другого процесса слать ему сообщения (диалоги потокобезопасны, кстати?) чтобы он увеличивал прогресс. По заверешии послать месседж чтобы его закрыли.
Но может быть есть менее болезненное решение?
У меня плагин Panel, она умеет скачивать файл с удаленного сервера по своему протоколу. Процесс долгий, хочется показывать прогресс.
Я пока что вижу один вариант: создать диалог, взять его handle и из другого процесса слать ему сообщения (диалоги потокобезопасны, кстати?) чтобы он увеличивал прогресс. По заверешии послать месседж чтобы его закрыли.
Но может быть есть менее болезненное решение?
- HaRT
- Moderator
- Posts: 10863
- Joined: Tue 30 Aug, 2005 17:21
- Has thanked: 221 times
- Been thanked: 358 times
Как лучше сделать индикатор прогресса для долгой операции?
Есть какой-то стандартный способ, при котором прогресс ещё и на кнопке в таскбаре отображается.
Но я плагины не пишу, поэтому конкретнее сказать не могу. Пусть лучше специалисты ответят.
Но я плагины не пишу, поэтому конкретнее сказать не могу. Пусть лучше специалисты ответят.
Фар есть инструмент, а не нянька. © 2009 DrKnS
Как лучше сделать индикатор прогресса для долгой операции?
Есть, через advanced functions, но он же только рисует прогресс на иконке в винде через API винды.
Разве он на фар влияет?
Разве он на фар влияет?
Как лучше сделать индикатор прогресса для долгой операции?
В смысле разве он рисует что-то на экране фара?
- HaRT
- Moderator
- Posts: 10863
- Joined: Tue 30 Aug, 2005 17:21
- Has thanked: 221 times
- Been thanked: 358 times
Как лучше сделать индикатор прогресса для долгой операции?
Понятия не имею. При большом желании можно в коде имеющихся плагинов посмотреть, как они делают прогресс/ отмену/ таймаут и пр., — например, в NetBox. Насколько оно там хорошо сделано, не имею представления.
Фар есть инструмент, а не нянька. © 2009 DrKnS
-
- Posts: 6836
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Как лучше сделать индикатор прогресса для долгой операции?
Из другого потока имеется в виду, или всё-таки процесса?
Ничего в Фаре не потокобезопасно. Для подобных ситуаций можно воспользоваться ACTL_SYNCHRO.
Диалог создавать не надо, обычная Message() без кнопок годится, обновляется по ACTL_SYNCHRO.
Как лучше сделать индикатор прогресса для долгой операции?
Имеется ввиду другой поток (CreateThread). Оно работает конечно, но мысль слать DMP_SETTEXT из другого потока мне не нравится (сегодня работает, завтра нет).
Во! Спасибо за мыслю про ACTL_SYNCHRO!
Если я с помощью ProcessSynchroEventW буду переключаться в главный поток и оттуда слать DM_SETTEXT но все будет хорошо, верно?
Смотрите:
main: создает диалог и передает его handle в CreateProcess (handle же просто int)
background: качает что мне нужно переодически с помощью ProcessSynchroEventW вызывает код который шлет DM_SETTEXT
все будет нормально?
А у Message разве handle есть? Как ей что-то послать?
Во! Спасибо за мыслю про ACTL_SYNCHRO!
Если я с помощью ProcessSynchroEventW буду переключаться в главный поток и оттуда слать DM_SETTEXT но все будет хорошо, верно?
Смотрите:
main: создает диалог и передает его handle в CreateProcess (handle же просто int)
background: качает что мне нужно переодически с помощью ProcessSynchroEventW вызывает код который шлет DM_SETTEXT
все будет нормально?
А у Message разве handle есть? Как ей что-то послать?
-
- Posts: 6836
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Как лучше сделать индикатор прогресса для долгой операции?
ProcessSynchroEvent и так вызывается в главном потоке, переключаться не надо, надо просто использовать данные из её параметра.
При ButtonsNumber==0 эта функция не создаёт окно, а просто рисует на экране. Вы просто вызываете её каждый раз с новыми данными, она рисует новое окошко поверх старого.
- HaRT
- Moderator
- Posts: 10863
- Joined: Tue 30 Aug, 2005 17:21
- Has thanked: 221 times
- Been thanked: 358 times
Как лучше сделать индикатор прогресса для долгой операции?
А как при таком подходе рекомендуется реализовывать досрочную отмену операции пользователем (Cancel)?
Фар есть инструмент, а не нянька. © 2009 DrKnS
Как лучше сделать индикатор прогресса для долгой операции?
Спасибо вам огромное, все получилось:
фоновый поток:
xxx.AdvControl(&xx_guid, ACTL_SYNCHRO, 0, &my_data);
главный поток:
ProcessSynchroEventW(info)
где info->Param и есть указатель на мою my_data.
Про message попробую, спасибо.
фоновый поток:
xxx.AdvControl(&xx_guid, ACTL_SYNCHRO, 0, &my_data);
главный поток:
ProcessSynchroEventW(info)
где info->Param и есть указатель на мою my_data.
Про message попробую, спасибо.
- zg
- zero-gravity
- Posts: 6035
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
-
- Posts: 6836
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Как лучше сделать индикатор прогресса для долгой операции?
Как рекомендуется - не знаю, я периодически (достаточно часто) делаю опрос нажатия клавиш, и при обнаружении Esc прерываю процесс (с запросом подтверждения от юзера, или без оного, в зависимости от ситуации).