Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.05.2011, 12:46
MrBadge MrBadge вне форума
Прохожий
 
Регистрация: 30.12.2009
Сообщения: 28
Репутация: 10
По умолчанию Альтернатива Sleep

Необходимо следующее: в процедуре программа должна простаивать (просто в этой процедуре дальше по коду не проходить) рандомное кол-во времени. Делаю это с помощью sleep, но в этом случае вся программа перестает отвечать на запросы (в том числе и нужные процедуры). Есть ли какая-то хорошая альтернатива sleep? Заранее благодарен
Ответить с цитированием
  #2  
Старый 02.05.2011, 12:49
Assistant Assistant вне форума
Продвинутый
 
Регистрация: 20.02.2011
Адрес: там где правят идиоты
Сообщения: 603
Версия Delphi: 7
Репутация: выкл
По умолчанию

взято из Delphi World:
Код:
procedure Delay(dwMilliseconds: Longint);
var
   iStart, iStop: DWORD;
begin
  iStart := GetTickCount;
  repeat
    iStop := GetTickCount;
    Application.ProcessMessages;
  until (iStop - iStart) >= dwMilliseconds;
end;
__________________
взялся из неоткуда, ничего не прошу, помогаю просто так
ICQ: 593977748 - стучать в случае КРАЙНЕЙ необходимости, ну, или если вы со Ставрополя
Ответить с цитированием
  #3  
Старый 02.05.2011, 12:59
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

без использования VCL:
Код:
uses Windows;

procedure Sleep(dwMilliseconds: DWORD);
var
  SaveTickCount: Cardinal;
  Msg: TMsg;
begin
  SaveTickCount:=GetTickCount;
  repeat
    if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
    begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
  until GetTickCount-SaveTickCount>=dwMilliseconds;
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #4  
Старый 02.05.2011, 14:06
MrBadge MrBadge вне форума
Прохожий
 
Регистрация: 30.12.2009
Сообщения: 28
Репутация: 10
По умолчанию

странно, попробовал оба варианта, но оба они работают так же, как и обычный слип (то есть во время их работы должны перехватываться нажатия клавиш, но этого не происходит). Программа не "висит", но и FormKeyPress не выполняется.
Может, проще описать проблему таким образом: нужно на некоторое время остановить выполнение процедуры, но так, чтобы все остальные процедуры работали
Ответить с цитированием
  #5  
Старый 02.05.2011, 15:00
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

я ожидал этого. потому что обе функции работают в одном потоке. решение - разделить:
Код:
type
  TMyThread = class(TThread)
  protected
    procedure Execute; override;
  end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 02.05.2011, 15:21
MrBadge MrBadge вне форума
Прохожий
 
Регистрация: 30.12.2009
Сообщения: 28
Репутация: 10
По умолчанию

В отдельный поток стоит вытащить весь таймер или процедуру задержки? Будет ли работать остановка процедуры таймера в этом случае?
Ответить с цитированием
  #7  
Старый 02.05.2011, 15:38
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от MrBadge
В отдельный поток стоит вытащить весь таймер или процедуру задержки? Будет ли работать остановка процедуры таймера в этом случае?
что за таймер?
Цитата:
Сообщение от MrBadge
Необходимо следующее: в процедуре программа должна простаивать (просто в этой процедуре дальше по коду не проходить) рандомное кол-во времени. Делаю это с помощью sleep, но в этом случае вся программа перестает отвечать на запросы (в том числе и нужные процедуры). Есть ли какая-то хорошая альтернатива sleep? Заранее благодарен
вынести в отдельный поток всю процедуру!
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #8  
Старый 02.05.2011, 15:43
MrBadge MrBadge вне форума
Прохожий
 
Регистрация: 30.12.2009
Сообщения: 28
Репутация: 10
По умолчанию

В том то и вопрос. Даже с Application.ProcessMessages; программа не реагирует на нажатие кнопок в момент задержки.
Про таймер: необходима задержка в процедуре таймера
В ней очень много vcl-компонентов задействовано, и если всю процедуру таймера выносить в поток, то придется каждое действие почти синхронизировать
Ответить с цитированием
  #9  
Старый 02.05.2011, 17:30
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Цитата:
Сообщение от MrBadge
Необходимо следующее: в процедуре программа должна простаивать (просто в этой процедуре дальше по коду не проходить) рандомное кол-во времени. Делаю это с помощью sleep, но в этом случае вся программа перестает отвечать на запросы (в том числе и нужные процедуры). Есть ли какая-то хорошая альтернатива sleep? Заранее благодарен
А я бы сделал с помощью таймера. Процедура разбивается на куски (case). После выполнения очередного куска запускается таймер на случайное время, запоминается номер этапа и осуществляется выход из процедуры.
В процедуре OnTimer таймер останавливается и вызывается процедура (номер этапа глобальный или передаётся через параметр):
Код:
var
  Step: Integer = 0;

procedure TForm1.Proc1;
begin
  case Step of
    0:
    begin
      //...
      Timer1.Interval:= Random(10000);
      Timer1.Enabled:= true;
      Inc(Step);
      Exit;
    end;
  1: //...

  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled:= false;
  Proc1;
end;

Последний раз редактировалось AlexSku, 02.05.2011 в 17:33.
Ответить с цитированием
  #10  
Старый 02.05.2011, 17:59
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

при нажатии на кнопку запускаем бесконечный цикл:

Код:
procedure Sleep(dwMilliseconds: DWORD);
var
  SaveTickCount: Cardinal;
  Msg: TMsg;
begin
  SaveTickCount:=GetTickCount;
  repeat
    if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
    begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
  until GetTickCount-SaveTickCount>=dwMilliseconds;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Tag:=0;
  while Tag>=0 do
  begin
    Label1.Caption:=IntToStr(Tag);
    Tag:=Tag+1;
    Sleep(100);
  end;
end;

при нажатии любой клавиши цикл останавливается:

Код:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  Tag:=-1;
end;

скачать целиком:
http://data.cod.ru/99641
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:09.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter