Вопрос такой. В диалоге при нажатии на кнопку выполняется долгое действие (несколько секунд). Но нормально показать прогрессбар нельзя - неоткуда взять максимальное значение, а также выполняемое действие не предполагает каллбэков для возможности изменения прогрессбара.
В оконном приложении, можно было бы в простейшем случае сделать курсор в виде "часиков", либо завесить какую-то GIFку (индикатор, бегающий туда-сюда, вращающаяся стрелка и т.д. - любая картинка для имитации бурной деятельности).
А как сделать что-то подобное средствами FarNet, не изобретая велосипеды? Какой-нибудь "псевдо-прогрессбар" тут есть ?
FarNet: аналог "песочных часиков" ?
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
FarNet: аналог "песочных часиков" ?
Нет такого типа прогресс бара, во всяком случае в консоли. Однако, начиная, вроде, с Windows 7 можно в иконке панели задач изобразить. Используйте IUserInterface.SetProgressState(TaskbarProgressBarState state) с параметром TaskbarProgressBarState.Indeterminate. Пример на PowerShellFar:
Code: Select all
# бегающая полоска в иконке задач
$Far.UI.SetProgressState('Indeterminate')
# "делаем работу"
Start-Sleep -Seconds 5
# очищаем прогресс в иконке задач
$Far.UI.SetProgressState('NoProgress')
-
- Posts: 5
- Joined: Thu 22 Oct, 2015 08:58
FarNet: аналог "песочных часиков" ?
Сделал такое:
На восьмёрке ничего в панели не увидел...
Ладно - а другой вопрос - здесь можно что-то делать с диалоговым окном в параллельном потоке (т.е. в одном потоке выполнять задачу, а в другом что-то там "отрисовывать" вручную псевдографикой?)
Code: Select all
Far.Api.UI.SetProgressState(TaskbarProgressBarState.Indeterminate);
Thread.Sleep(10000);
Far.Api.UI.SetProgressState(TaskbarProgressBarState.NoProgress);
Ладно - а другой вопрос - здесь можно что-то делать с диалоговым окном в параллельном потоке (т.е. в одном потоке выполнять задачу, а в другом что-то там "отрисовывать" вручную псевдографикой?)
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
FarNet: аналог "песочных часиков" ?
> На восьмёрке ничего в панели не увидел...
А где вы смотрите? Надо на иконке Фара (его "прямоугольнике" в панели).
> здесь можно что-то делать с диалоговым окном в параллельном потоке
Можно, но не напрямую. Фар не позволяет многопоточное использование за исключением оговоренных случаев. Иногда можно выкручиваться с помощью IFar.PostJob, PostStep, если действительно надо. Я бы без особой нужды не стал. Эти методы выполняются из основного потока Фара, когда он получает управление. Но вызывать из можно из других потоков. Не обязательно этот сценарий вам подходит.
Стандартных средств для такой задачи нет ни в Фаре, ни в Фарнете. Так что дерзайте, делитесь результатами и опытом.
А где вы смотрите? Надо на иконке Фара (его "прямоугольнике" в панели).
> здесь можно что-то делать с диалоговым окном в параллельном потоке
Можно, но не напрямую. Фар не позволяет многопоточное использование за исключением оговоренных случаев. Иногда можно выкручиваться с помощью IFar.PostJob, PostStep, если действительно надо. Я бы без особой нужды не стал. Эти методы выполняются из основного потока Фара, когда он получает управление. Но вызывать из можно из других потоков. Не обязательно этот сценарий вам подходит.
Стандартных средств для такой задачи нет ни в Фаре, ни в Фарнете. Так что дерзайте, делитесь результатами и опытом.
- HaRT
- Moderator
- Posts: 10862
- Joined: Tue 30 Aug, 2005 17:21
- Has thanked: 221 times
- Been thanked: 358 times
FarNet: аналог "песочных часиков" ?
Вроде бы в текстовых (и не только) приложениях давным-давно применяется этакая „вертушка“ в виде последовательно сменяющих друг друга символов | / — \ | и т.д.
Фар есть инструмент, а не нянька. © 2009 DrKnS
-
- Posts: 5
- Joined: Thu 22 Oct, 2015 08:58
FarNet: аналог "песочных часиков" ?
Пожалуй, да. И я не стал. Сделал упрощённо (просто вывод статического сообщения), примерно так:
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();
...