Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2009, 19:16   #1
lemeshev
 
Регистрация: 15.05.2009
Сообщений: 3
По умолчанию Последовательность выполнения процедур

Помогите решить проблему.
Есть 2-е процедуры.
К примеру по нажатию кнопки 1 запускается процедура 1.
Процедура выполняется долго к примеру 10 секунд.
Если на 5-й секунде нажатием кнопки 2 запустить процедуру 2,
процедура 1 останавливается, выполняется процедура 2,
после чего продолжает выполняться процедура 1.

Что можно придумать, не перенося процедуры в потоки,
чтобы при нажатии кнопки 2, процедура 1 доработала до конца
и только после этого исполнилась процедура 2?

Одним словом необходимо чтобы процедуры ваполнялись до конца в порядке их вызовов.

Простейший пример ниже.

Код:
procedure TForm1.Button5Click(Sender: TObject);
var i:integer;
begin
  for i:=0 to 100 do
  begin
    sleep(100);
    Application.ProcessMessages;
    progressbar1.Position:=i;
  end;
end;

procedure TForm1.Button6Click(Sender: TObject);
var i:integer;
begin
  for i:=0 to 100 do
  begin
    sleep(100);
    Application.ProcessMessages;
    progressbar2.Position:=i;
  end;
end;
lemeshev вне форума Ответить с цитированием
Старый 15.05.2009, 19:46   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

1.не использовать внутри этих процедур
application.processmessage;

2.при запуске процедуры блокировать возможность вызова других процедур
buttonA.enable:=false;
и разблокировать по окончании
buttonA.enable:=true;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 15.05.2009 в 19:49.
evg_m на форуме Ответить с цитированием
Старый 15.05.2009, 20:02   #3
lemeshev
 
Регистрация: 15.05.2009
Сообщений: 3
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
1.не использовать внутри этих процедур
application.processmessage;

2.при запуске процедуры блокировать возможность вызова других процедур
buttonA.enable:=false;
и разблокировать по окончании
buttonA.enable:=true;
1. форма должна оставаться активной.
2. процедуры в реальной задаче запускаются 3-мя способами: Кнопка/Таймер/По факту коннекта сокета.
Эти события нельзя блокировать, нужно просто выполнять процедуры последовательно и до конца.
lemeshev вне форума Ответить с цитированием
Старый 15.05.2009, 20:08   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

ставить флаг занято
вести лог(очередь) запусков
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 15.05.2009, 20:33   #5
lemeshev
 
Регистрация: 15.05.2009
Сообщений: 3
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
ставить флаг занято
вести лог(очередь) запусков
К примеру ставлю флаг занято на время выполнения процедуры 1.
В начале процедуры 2 циклически проверяю флаг, но пока я проверяю флаг в процедуре 2 процедура 1 не работает и соответственно обе процедуры виснут навсегда.

Я уже пробовал эксперементировать и с Event и с WeitableTimer результат пока тот же.

Вероятно действительно придется заводить очередь и выполнять запросы последовательно по очереди.
lemeshev вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Последовательность CrazyRabbit Помощь студентам 14 08.02.2009 17:22
Паскаль, последовательность Кагбе_Прогер Помощь студентам 2 22.12.2008 13:11
Последовательность событий MAcK Общие вопросы Delphi 2 20.11.2008 14:36
последовательность pakusya Помощь студентам 1 17.10.2008 17:33
числовая последовательность pelsh Помощь студентам 1 15.02.2008 03:20