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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2011, 12:21   #1
mrbadge
Пользователь
 
Регистрация: 26.01.2011
Сообщений: 48
По умолчанию Альтернатива Sleep;

Необходимо следующее: в процедуре программа должна простаивать (просто в этой процедуре дальше по коду не проходить) рандомное кол-во времени. Делаю это с помощью sleep, но в этом случае вся программа перестает отвечать на запросы (в том числе и нужные процедуры). Есть ли какая-то хорошая альтернатива sleep? Заранее благодарен
mrbadge вне форума Ответить с цитированием
Старый 02.05.2011, 13:15   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Делай это в потоках.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.05.2011, 13:49   #3
mrbadge
Пользователь
 
Регистрация: 26.01.2011
Сообщений: 48
По умолчанию

Но при этом выполнение одной процедуры (конкретно, Timer) должно быть остановлено, а другая (в частности, FormKeyPress) продолжать работать. Ведь если сделать в двух разных потоках, то Timer все равно выполнить до конца сразу. Или можно ждать завершения потока в определенном месте кода?
mrbadge вне форума Ответить с цитированием
Старый 02.05.2011, 13:57   #4
mrbadge
Пользователь
 
Регистрация: 26.01.2011
Сообщений: 48
По умолчанию

Может, проще описать проблему таким образом: нужно на некоторое время остановить выполнение процедуры, но так, чтобы все остальные процедуры работали
mrbadge вне форума Ответить с цитированием
Старый 02.05.2011, 14:37   #5
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Если вызов Sleep разбить на "атомы", допустим по 100 мсек (в зависимости от задачи), то в промежутках между вызовами Sleep можно выполнять все остальное.
Примерно так:
Код:
procedure NNNNNN;
var S : Integer;
begin
  Label2.Caption := 'first time'; //код до задержки

  //кусок, который выполняет задержку дальнейшего выполнения этой процедуры
  S := 100;         //10 сек (100 раз в совокупности с 100 мсек в Sleep)
  while S >= 0 do begin
    Sleep(100);
    Application.ProcessMessages;
    Dec(S)
  end;
  //окончание задержки

  Label2.Caption := 'second time';  //код после задержки
end;
Признаться не понял что значит "(конкретно, Timer)". Если это процедура обработки OnTimer, то описанный прием не прокатит, если интервал таймера меньше задержки, заданной в процедуре.
Уточнить бы.

Последний раз редактировалось Прик; 02.05.2011 в 14:55.
Прик вне форума Ответить с цитированием
Старый 02.05.2011, 14:54   #6
mrbadge
Пользователь
 
Регистрация: 26.01.2011
Сообщений: 48
По умолчанию

да, конкретно пауза нужна в таймере. Делал нечто подобное, предварительно выключая, а после задержки включая таймер, но нет, именно во время задержки форма перестает перехватывать нажатия клавиш (что мне как раз и нужно), как только задержка проходит, все становится нормально
mrbadge вне форума Ответить с цитированием
Старый 02.05.2011, 15:01   #7
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Application.ProcessMessages;
позволяет передавать управление системе. В приведенном примере как раз этот способ и позволяет управлять программой в то время как процедура "на тормозе".

Эксперимент показал, что и в процедуре обработки таймера прием работает.
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var S : Integer;
begin
  Timer1.Enabled := false;
  S := 100;
  while S >= 0 do begin
    Sleep(100);
    Application.ProcessMessages;
    Dec(S)
  end;
  Timer1.Enabled := True;
end;
Необходимо учитывать время задержки и время интервала таймера. Т.е. их нужно сложить чтобы получить общий интервал срабатывания таймера.

Последний раз редактировалось Прик; 02.05.2011 в 15:17.
Прик вне форума Ответить с цитированием
Старый 02.05.2011, 15:13   #8
mrbadge
Пользователь
 
Регистрация: 26.01.2011
Сообщений: 48
По умолчанию

Application.ProcessMessages; Про это я знаю) Но если время задержки больше времени таймера?
mrbadge вне форума Ответить с цитированием
Старый 02.05.2011, 15:24   #9
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Ну, если мы отключаем таймер (Timer1.Enabled := false), то какое это имеет значение.
После отработки задержки таймер вновь включается и вызывает свою процедуру через заданный ему интервал.
Прик вне форума Ответить с цитированием
Старый 02.05.2011, 15:38   #10
mrbadge
Пользователь
 
Регистрация: 26.01.2011
Сообщений: 48
По умолчанию

Странно) Мой эксперимент показывает, что этот вариант тоже не работает) Форма не подает никаких признаков жизни по время прокрутки while (что весьма удивительно). В необходимый FormKeyPress программа в этот момент не заходит.
mrbadge вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
функция Sleep() ^Angel^ Общие вопросы C/C++ 9 07.05.2011 13:27
Альтернатива sleep для треда bulldog5293 Общие вопросы Delphi 28 08.12.2010 21:58
Функция Sleep(); VadEr Общие вопросы Delphi 6 10.09.2009 17:45
Аналог Sleep() Ants Общие вопросы Delphi 2 18.11.2008 13:11
Альтернатива sleep Zuzlan Общие вопросы Delphi 2 01.11.2007 01:44