Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Индикатор занятости программы? Подскажите как лучше организовать? [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 смотрели?


Наверх

Титульная страница Поиск, карта сайта Написать письмо