FarNet: аналог "песочных часиков" ?

Место, где разработчики плагинов могут поделиться своим опытом.
Post Reply
AlexanderR
Posts: 5
Joined: Thu 22 Oct, 2015 08:58

FarNet: аналог "песочных часиков" ?

Post by AlexanderR » Tue 27 Oct, 2015 03:55

Вопрос такой. В диалоге при нажатии на кнопку выполняется долгое действие (несколько секунд). Но нормально показать прогрессбар нельзя - неоткуда взять максимальное значение, а также выполняемое действие не предполагает каллбэков для возможности изменения прогрессбара.
В оконном приложении, можно было бы в простейшем случае сделать курсор в виде "часиков", либо завесить какую-то GIFку (индикатор, бегающий туда-сюда, вращающаяся стрелка и т.д. - любая картинка для имитации бурной деятельности).
А как сделать что-то подобное средствами FarNet, не изобретая велосипеды? Какой-нибудь "псевдо-прогрессбар" тут есть ?

User avatar
NightRoman
Posts: 5849
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

FarNet: аналог "песочных часиков" ?

Post by NightRoman » Tue 27 Oct, 2015 06:49

Нет такого типа прогресс бара, во всяком случае в консоли. Однако, начиная, вроде, с Windows 7 можно в иконке панели задач изобразить. Используйте IUserInterface.SetProgressState(TaskbarProgressBarState state) с параметром TaskbarProgressBarState.Indeterminate. Пример на PowerShellFar:

Code: Select all

# бегающая полоска в иконке задач
$Far.UI.SetProgressState('Indeterminate')

# "делаем работу"
Start-Sleep -Seconds 5

# очищаем прогресс в иконке задач
$Far.UI.SetProgressState('NoProgress')

AlexanderR
Posts: 5
Joined: Thu 22 Oct, 2015 08:58

FarNet: аналог "песочных часиков" ?

Post by AlexanderR » Tue 27 Oct, 2015 10:47

Сделал такое:

Code: Select all

Far.Api.UI.SetProgressState(TaskbarProgressBarState.Indeterminate);
Thread.Sleep(10000);
Far.Api.UI.SetProgressState(TaskbarProgressBarState.NoProgress);
На восьмёрке ничего в панели не увидел...
Ладно - а другой вопрос - здесь можно что-то делать с диалоговым окном в параллельном потоке (т.е. в одном потоке выполнять задачу, а в другом что-то там "отрисовывать" вручную псевдографикой?)

User avatar
NightRoman
Posts: 5849
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

FarNet: аналог "песочных часиков" ?

Post by NightRoman » Tue 27 Oct, 2015 11:26

> На восьмёрке ничего в панели не увидел...
А где вы смотрите? Надо на иконке Фара (его "прямоугольнике" в панели).

> здесь можно что-то делать с диалоговым окном в параллельном потоке
Можно, но не напрямую. Фар не позволяет многопоточное использование за исключением оговоренных случаев. Иногда можно выкручиваться с помощью IFar.PostJob, PostStep, если действительно надо. Я бы без особой нужды не стал. Эти методы выполняются из основного потока Фара, когда он получает управление. Но вызывать из можно из других потоков. Не обязательно этот сценарий вам подходит.

Стандартных средств для такой задачи нет ни в Фаре, ни в Фарнете. Так что дерзайте, делитесь результатами и опытом.

User avatar
HaRT
Moderator
Posts: 8048
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 100 times

FarNet: аналог "песочных часиков" ?

Post by HaRT » Tue 27 Oct, 2015 12:23

Вроде бы в текстовых (и не только) приложениях давным-давно применяется этакая „вертушка“ в виде последовательно сменяющих друг друга символов | / — \ | и т.д.
Фар есть инструмент, а не нянька. © 2009 DrKnS

AlexanderR
Posts: 5
Joined: Thu 22 Oct, 2015 08:58

FarNet: аналог "песочных часиков" ?

Post by AlexanderR » Tue 27 Oct, 2015 15:58

NightRoman wrote: Я бы без особой нужды не стал.
Пожалуй, да. И я не стал. Сделал упрощённо (просто вывод статического сообщения), примерно так:

Code: Select all

   [DllImport("user32.dll")]  //Для имитации нажатия кнопки в потоке
   public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
   ...
   Task.Factory.StartNew(() =>
   {
     ...
    Thread.Sleep(3000); //Что-то "делаем"
    keybd_event((byte)0x1B /*VK_ESC*/, 0, 0x0001/*KEYEVENTF_EXTENDEDKEY*/ | 0, 0); //"Нажимаем" ESC
   });
   string msg = "Выполняется что-то (ESC-прервать)...";
   IDialog dial1 = Far.Api.CreateDialog(-1, -1, msg.Length+2, 3);
   dial1.AddText(1, 1, msg.Length + 1, msg);
   dial1.Show();
   ...
"Крутилок" нет, но пользователь хотя бы понимает, что FAR не висит, а что-то делается. Для нескольких секунд сойдёт и так, я думаю. Дальше только докрутить обработку исключений и анализ результата.

Post Reply

Return to “Разработка плагинов”