![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Индикатор занятости программы? Подскажите как лучше организовать? [D7, WinXP]
lipskiy © (2004-08-25 21:00:00)Нужен некий индикатор того, что программа не висит а что-то делает. Какой-то живой индикатор. Проблема в том, что когда выполняется какой-то длительный код, не перерисовывается главное окно и не работают никакие таймеры. Application.ProcessMessages не подходит, так как у меня не цикл а просто длинный набор разнообразных тяжелых операций, разбавлять весь код Application.ProcessMessages совсем неинтересно.
Нужен такой инструмент, который через одно свойство можно включить, и отобразится окошко с каким-то живым индикатором, и индикатор будет перерисовываться независимо от текущей загрузки главного потока программы. По окончании работы - просто выключить.
Пробовал делать отдельный поток для индикатора, в нем создавать форму чтобы на ней потом рисовать индикатор, но что-то программа виснет при выходе...
Выполнять тяжелый код в потоке не предлагать, мне этот вариант не подходит по ряду причин.
lipskiy (2004-08-25 21:48:00) [1]Спасибо, эту тему не рассматривал.
Обязательно попробую.
> > Выполнять тяжелый код в потоке не предлагать, мне этот
> вариант
> > не подходит по ряду причин.
>
>
> Каких?
Во-первых, проект почти готов, он однопоточен и перелопачивать его нет возможности.
Во-вторых, смысла большого нет, поскольку во время выполнения тяжелых операций пользователю все равно не разрешается работать с интерфейсом программы, он должен просто ждать окончания операции (по логике работы программы).
В-третьих, куски кода, выполняющие эти операции, нелегко выделить в обособленный объем, поскольку они сильно переплетены и между собой, и с графическим интерфейсом.
sdw_syscoder (2004-08-25 21:24:00) [2]Самый самолёт в твоём случае - это через TAnimate!
Вобщем такая маза:
1. Создаём файл с ресурсом этого самого AVI-файла.
2. Линкуем его к проекту:
{$R AVIRES.RES}
3. Инициализировать из ресурса будем так:
procedure AVIResource(OnOff: integer);
begin
Animate1.ResName := 'ReceiveAvi'; // ReceiveAvi-имя ресурса, с которым его скомпилили
if OnOff = 1 then Animate1.Active := True
else
begin
Animate1.Active := False;
Animate1.ResName := '';
end;
end;
4. А Врубать и Вырубать примерно так:
AVIResource(1); // On
AVIResource(0); // Off
Удачки!
Mim1 (2004-08-25 21:01:00) [3]
> Выполнять тяжелый код в потоке не предлагать, мне этот вариант
> не подходит по ряду причин.
Каких?
По вопросу TAnimate смотрели?