Индикатор выполнения в консольном приложении?

Kotъ-Begemotъ

Есть вот у меня консольное приложение. Реально - из одной базы в другую по определённым условиям переносит данные. По сути в консольном приложении делается вызов одной функции из другого модуля, в которой и выполняется перенос, а всё остальное - это запись в лог-файл и вывод на экран или строки что "всё успешно" или ошибки.Но функция работает достаточно долго, так как таблицы для переноса здоровые, поэтому хотелось бы чтобы юзер видел, что не зависло ничего. Может быть что-то вроде "Выполняется перенос..." написать, и дальше или многоточие рисовать по одной точке, при отрисовке трёх точек сбрасывать, и снова рисовать, или "крутящийся" символ / | \ - рисовать?Это вроде как возможно просто переписывая поверх строку вывода без переноса строки. Но немного непонятно как с функцией быть... Из консольного приложения ведь передаётся управление этой функции... А из функции вывода на экран нет. Какой-то замкнутый круг.Что остаётся? Поток? Создать дополнительный поток, из него вызвать эту функцию и ждать завершения? А в основном потоке рисовать что вздумается? Как считаете?
21 ответ

Kotъ-Begemotъ

Поток и не важно консоль или ГУИ--http://www.podgoretsky.com


Kotъ-Begemotъ

При вызове функции передавать указатель но процедуру "колбэка" из консольного приложения...И в функции переноса вызывать её периодически...


Kotъ-Begemotъ

Поток и не важно консоль или ГУИ
Не нужноо никаких потоков... Не надо усложнять...


Kotъ-Begemotъ

Откуда вдруг взялся/возьмется колбак при синхронном вызове.--http://www.podgoretsky.com


Kotъ-Begemotъ

[quot Anatoly Podgoretsky]Откуда вдруг взялся/возьмется колбак при синхронном вызове.Создать/написать такую функцию в консольном приложении и передавать её указатель в вызываемый модуль...Насколько я понимаю, вызываемый модуль можно переписать для вызова колбэка...Насколько я понял, в том модуле много чего делается. Так что можно найти места, куда воткнуть вызов колбэка...


Kotъ-Begemotъ

[quot Anatoly Podgoretsky]Откуда вдруг взялся/возьмется колбак при синхронном вызове.Создать/написать такую функцию в консольном приложении и передавать её указатель в вызываемый модуль...Насколько я понимаю, вызываемый модуль можно переписать для вызова колбэка...Насколько я понял, в том модуле много чего делается. Так что можно найти места, куда воткнуть вызов колбэка...
Ага. Особенно шоколадно, когда там идет опять же синхронный вызов запроса минут на дцать.


Kotъ-Begemotъ

Гавриленко Сергей Алексеевич,Зато колбэк можно сделать более информативным... При вызове передавать что именно делается в данный момент... А не просто точки выводить...


Kotъ-Begemotъ

Гавриленко Сергей Алексеевич,Зато колбэк можно сделать более информативным... При вызове передавать что именно делается в данный момент... А не просто точки выводить...
Ага, спасибо, я это учту на будущее. А в данном случае надо что угодно ,лишь бы юзер не подумал что "висим". А то люди разные, попадаются и нервные, полезет сразу задачу снимать, или вообще ресет давить Для данной задачи думаю с потоками поиграюсь, а про коллбэк функции надо еще почитать, и на будущее учесть этот вариант.


Kotъ-Begemotъ

Для колбак функций должна быть поддержка на уровне вызываемого модуля, откуда она возьмется то для баз, это большая редкость.Ассинхронная работа более реальна, но тоже не всегда.Проще всего поток, гарантировано.Это все советы для абстрактного случая, а конкретностью ты никогда не страдал.--http://www.podgoretsky.com


Kotъ-Begemotъ

Это все советы для абстрактного случая, а конкретностью ты никогда не страдал.--http://www.podgoretsky.com
Это не я такой скрытный, это проект такой :( В нём очень много сделано через ж... через такие удивительные места, что одно описание этого займёт слишком много места, и вызовет слишком громкий смех, чтобы кто-то был в состоянии при этом еще и ответить что-то дельное Очень старый проект, который никто не пытался рефакторить, или улучшать. Ну по мере работы, естественно выкидываю совсем уж страшные куски, заменяя нормальными, но это капля в море :( В результате проект медленно но верно стремится к "системе костылей и подпорок, связанной гнилой бечёвкой" Достаточно сказать, что разработка до сих пор ведётся на Дельфи 6...


Kotъ-Begemotъ

Эээ... коллеги, а для консоли есть какой-нибудь способ вывести красиво скажем надпись:"Выполняется, ждите" и после неё "бегущее" многоточие, которое периодически сбрасывается, кроме чего-то вроде этого (не обращайте внимания на мелочи, это выдранный кусок, я про саму суть "отрисовки"):
<b>while</b> True <b>do</b>
 <b>begin</b>
 <b>for</b> j := <b>0</b> <b>to</b> <b>4</b> <b>do</b>
 <b>begin</b>
 Write('.');
 Sleep(<b>500</b>);
 <b>end</b>;
 <b>for</b> k := <b>0</b> <b>to</b> <b>4</b> <b>do</b>
 Write(Chr(VK_BACK));
 Write(' ');
 <b>for</b> k := <b>0</b> <b>to</b> <b>4</b> <b>do</b>
 Write(Chr(VK_BACK));
 <b>if</b> DoneProc <b>then</b>
 Break;
 <b>end</b>;


Kotъ-Begemotъ

Конечно есть, смотри в справке функции консоли--http://www.podgoretsky.com


Kotъ-Begemotъ

Конечно есть, смотри в справке функции консоли--http://www.podgoretsky.com
Гм... Или не там искал, или не так, но что-то ничего дельного в справке от Delphi7 не нашёл


Kotъ-Begemotъ

<b>program</b> Project1;

<i>{$APPTYPE CONSOLE}</i>

<b>uses</b>
 SysUtils;

<b>const</b> sym = '\|/-';
 fmt = '%2d: %s';

<b>var</b> i, j, k: integer;
<b>begin</b>
 <b>for</b> i := <b>0</b> <b>to</b> <b>20</b> <b>do</b> <b>begin</b>
 <b>for</b> j := <b>1</b> <b>to</b> <b>4</b> <b>do</b> <b>begin</b>
 Write(Format(fmt, [i, sym[j]]));
 Sleep(<b>100</b>);
 <b>for</b> k := <b>0</b> <b>to</b> Length(Format(fmt, [i, ' '])) <b>do</b> Write(#<b>8</b>);
 <b>end</b>;
 <b>end</b>;
 WriteLn('>');
 ReadLn;
<b>end</b>.


Kotъ-Begemotъ

Гм... Или не там искал, или не так, но что-то ничего дельного в справке от Delphi7 не нашёл
SetConsoleCursorPosition


Kotъ-Begemotъ

+
Так по моему проще:
Write(Format(fmt, [i, sym[j]]));
 Sleep(<b>100</b>);
 Write(#<b>13</b>);


Kotъ-Begemotъ

__Avenger__, креститесь ) я за вариант Анатолия... чуть подрихтуем вариант Gator'а
<b>program</b> Project1;

<i>{$APPTYPE CONSOLE}</i>

<b>uses</b>
 Windows,
 SysUtils;

<b>const</b> sym = '\|/-';
 fmt = '%2d: %s';

<b>var</b> i, j, k: integer;
 C: _coord;
<b>begin</b>
 <b>for</b> i := <b>0</b> <b>to</b> <b>100</b> <b>do</b> <b>begin</b>
 <b>for</b> j := <b>1</b> <b>to</b> <b>4</b> <b>do</b> <b>begin</b>
 c.X := <b>34</b>; c.y := <b>10</b>;
 SetConsoleCursorPosition(GetStdHandle(Std_Output_Handle), c );
 Write( i:<b>3</b>, ':', sym[j]);
 Sleep(<b>50</b>);
 <b>end</b>;
 <b>end</b>;
 WriteLn('>');
 ReadLn;
<b>end</b>.


Kotъ-Begemotъ

[/src][/spoiler]
Так по моему проще:
Write(Format(fmt, [i, sym[j]]));
 Sleep(<b>100</b>);
 Write(#<b>13</b>);
[/quot]Не надо как проще, надо как правильно.


Kotъ-Begemotъ

__Avenger__, креститесь ) я за вариант Анатолия... чуть подрихтуем вариант Gator'а
Его значительно больше надо рихтовать, во первых использовать GetConsoleCursorPosition, вместо констант,во вторых GetStdHandle(Std_Output_Handle) надо вынести за пределы цикла.


Kotъ-Begemotъ

Anatoly Podgoretsky, а это уже за другие деньги )))


Kotъ-Begemotъ

Ну понятно, что кормить нужно, а то человек без пищи умирает.--http://www.podgoretsky.com