Имя пользователя:
Пароль:
 

Название темы: Delphi .: [все вопросы] :.
Показать сообщение отдельно
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Ещё вариант - сделать "разделяемую" задачу, то есть загнать все внутренние цикловые переменные долго выполняемой программы в класс TMyJob, ввести переменную состояния TMyJob.state: integer {0=constructing, 1=running, 2=suspened, 3=finished}, и функцию TMyJob.proceed(), которая возвращается если 2<=state и содержит выполняемый цикл. Чтобы всё гладко работало, нужно периодически в цикле делать так:
Код: Выделить весь код
function TMyJob.proceed() : boolean;
begin
   while 2<=state do begin
      ProcessMessages; //обрабатывает сообщения, в т.ч. от мышки и таймера

      for ... // цикл, который работает примерно 0.5 - 1 секунду
   end
end
Чтобы продложить работу такой приостановленной задачи, достаточно вызвать TMyJob.proceed(). Если есть несколько таких "задач", то лучше имитировать многозадачность:
Код: Выделить весь код
var jobs : array of TMyJob;
var job_n: integer;

procedure sheduled_jobs(); // запускать из Application.OnIdle
begin
   if (High(job_n) < job_n) job_n = Low(job_n);
   jobs[job_n].proceed();
end;

function TMyJob.proceed() : boolean;
begin
   if 2<=state then begin
      for ... // цикл, который работает примерно 0.5 - 1 секунду
   end
end
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:02, 20-04-2009 | #53

Название темы: Delphi .: [все вопросы] :.