Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/60: Рейтинг темы: голосов - 60, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 22.09.2007
Сообщений: 314

Sleep(1000): Как сделать паузу и в тоже время иметь контроль над формой?

18.09.2011, 18:31. Показов 12458. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как в Delphi сделать паузу и в тоже время иметь контроль над программой?
Допустим, я ставлю в цикле функцию Sleep(1000); но в эти 1000 миллисекунд надо продолжать получать сообщения от пользователя. Например если на 500-й миллисекунде он нажмет кнопку выхода, то надо выйти сразу, а не дожитаться, когда законатся остальные 500.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.09.2011, 18:31
Ответы с готовыми решениями:

Как сделать паузу без подвисания и без вызова Sleep?
Здравствуйте, как можно сделать паузу без "второго" потока и вешания программы посредством System.Threading.Thread.Sleep? ...

Как сделать паузу во времени во время выполнения макроса?
типа Aplication.wait не проходит мне надо чтоб типа VBAProject.wait или pause ??? т.е. надо отслеживать работу макроса и если что то не...

Сделать паузу во время цикла
есть цикл который выводит цвета-непрерывно. И есть подьзователь,который нажимает старт игры,паузу и выход. Не могу сделать паузу во время...

14
1 / 1 / 1
Регистрация: 29.04.2011
Сообщений: 28
19.09.2011, 00:19
Чего то не совсем понятна ситуация. Но помоему, здесь нужно использовать отдельный поток.
0
3 / 3 / 3
Регистрация: 09.07.2008
Сообщений: 422
19.09.2011, 10:40
Смотри в сторону TThread.
0
0 / 0 / 0
Регистрация: 22.09.2007
Сообщений: 314
19.09.2011, 11:07  [ТС]
>> Смотри в сторону TThread.
а что такое TThread? Я просто в Delphi совсем новичок, дальше простейших компонентов пока не продвинулся. Судя по названию это какой-то класс или шаблон...
0
1 / 1 / 0
Регистрация: 17.10.2010
Сообщений: 13
19.09.2011, 14:07
Sleep это очень плохая команда. Работает иногда не правильно, особенно когда Sleep(10) и меньше. Попробуй Thread Object (Это новый поток в твоей программе). File->new->Other и в окне New Items выбери Thread Object. Тогда используй это:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
type
  Potok = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  public
    constructor Create; reintroduce;
    destructor Destroy; override;
  end;
constructor Potok.Create;
begin
  inherited Create(false);
  FreeOnTerminate:=true;     // это освободит поток при остановке
end;
destructor Potok.Destroy;
begin
  inherited Destroy;
end;
procedure Potok.Execute;
begin
//....
  //  А тут пиши всё, чего душе угодно   
//....
end;
Вот и всё! Но всё же советую не использовать потоки в своей программе. Попробуй использовать в больших циклах
Application.ProcessMessages
0
0 / 0 / 0
Регистрация: 22.09.2007
Сообщений: 314
19.09.2011, 14:20  [ТС]
А у мен ят так используется Application.ProcessMessages, сразу после sleep(1000). Вто кусок моей программы:

Это обработчик кнопки:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var
      Form1: TForm1;
      IsRunning : Boolean = false;
 
procedure TForm1.StartStopBtnClick(Sender: TObject);
 
begin
    if IsRunning then
    begin
        IsRunning := false;
        StartStopBtn.Caption := 'Стоп'
        Exit;
    end;
 
    Clear.Enabled := false;
    
    StartStopBtn.Caption := 'Пуск'
    IsRunning := true;
 
    while IsRunning do
    begin
        Sleep(1000);
 
        {здесь крутится цикл}
       
        Application.ProcessMessages;
    end;
    
end;
0
1 / 1 / 7
Регистрация: 28.06.2011
Сообщений: 342
20.09.2011, 15:10
Sleep _ это функция Win API... Потому (о потоках - забудь.. фигню тут тебе написали) напиши свою функцию а-ля Sleep.. Это будет цикл с использованием GetTickCount вида
Delphi
1
2
3
4
5
6
7
8
9
10
procedure MySleep(ATime : LongInt);
var
 T : Integer;
begin
  T := GetTickCount;
  while (GetTickCount - T) < ATime do
    begin
     Application.ProcessMessages;
    end;
end;
0
1 / 1 / 7
Регистрация: 28.06.2011
Сообщений: 342
20.09.2011, 15:14
А то, что ты после Sleep(1000) вызываешь ProcessMessages - тоже лажа... Ведь пауза делается в Sleep.. до ProcessMessages код еще не выполнился..:-).. Точнее, прога все-таки реагирует.. Только очень дергано.. так ? А вообще, что за задача ? или так, практика ума ?
0
0 / 0 / 0
Регистрация: 22.09.2007
Сообщений: 314
20.09.2011, 15:34  [ТС]
То, что ProcessMessages не выполняется я и сам понимаю, и что Sleep - наследство доса, вообще устаревшая парадигма программирования тоже понятно. Вообще идея с потоками мне показалась интересной, тк это естественнее, оборвать программу (предусмотрев такую возможность), а всякие хитрости с собственной паузой это немного не то. Но в потоках я еще не разобрался и экспериментировал по всякому. И мне подсказали решение, как две капли воды похожее на то, что тв мне предложил. Вот оно:
Code
1
2
3
4
5
6
7
8
9
10
procedure Delay(msec: Longint);
var
    start, stop: Longint;
begin
    start := GetTickCount;
    repeat
        stop := GetTickCount;
        Application.ProcessMessages;
    until (stop - start) >= msec;
end;
0
0 / 0 / 0
Регистрация: 22.09.2007
Сообщений: 314
20.09.2011, 15:37  [ТС]
Но оно мне кажется менее красивым, чем с потоками. Хотя некоторые не рекомендуют использовать потоки без надобности. Да и Sleep оказалась pure Win32, так что.... Остались вопросы: а что такое GetTickCount?
А прога эта - реализация математической игры 'Жизнь Джона Конуэя', т.е. для души...
0
1 / 1 / 7
Регистрация: 28.06.2011
Сообщений: 342
20.09.2011, 17:07
Птоки нужно использовать, если решаешь одновременно несколько задач.. В принципе, в этом нет ничего плохого.. Только нужно ли это конкретно здесь ? Тебе решать - твоя задача..Я вообще больше по работе с БД специализируюсь...
0
0 / 0 / 0
Регистрация: 22.09.2007
Сообщений: 314
20.09.2011, 17:10  [ТС]
вто именно что здесь это как раз не надо простой алгоритм работы с массивом, все линейно.
0
0 / 0 / 0
Регистрация: 22.09.2007
Сообщений: 314
20.09.2011, 17:10  [ТС]
А что все таки такое GetTickCount???
0
1 / 1 / 0
Регистрация: 17.10.2010
Сообщений: 13
22.09.2011, 15:31
Да, ну и жёсткая критика! Я написал про ProcessMessage, как один из вариантов, но не лепить его перед слипом или после. Я сам знаю, что это ничего не даст. GetTickCount это функция которая берёт системное время (миллисекунды). Ну ты делаешь свой цикл и в смотришь сколько прошло миллисекунд когда ты в нём крутился.
0
KRlSTO
25.03.2012, 13:12
Попробуй немного модернизированную паузу:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure pause(ph:Word;pm:Word;ps:Word;pms:Word);  // Пауза(ph-часы(0-23); pm-минуты(0-59); ps-секунды(0-59); pms-милисекунды(0-999)
var
  pa1,pa2:ttime;
  Hour, Min, Sec, MSec: Word;
begin
  pa1:=encodetime(ph,pm,ps,pms)+time;
  repeat
    application.processmessages;
    sleep(10);
    if (getasynckeystate(VK_ESCAPE)<>0) then Halt;  // Закрыть прогу (к примеру)
    pa2:=pa1-time;
    DecodeTime(pa2, Hour, Min, Sec, MSec);
  until (time>=pa1);
end;
Вставь этот код после {$R *.dfm} и дальше например в обработке нажатия на кнопку:
Code
1
2
3
4
procedure TForm1.Button1Click(Sender: TObject);
begin
  pause(0,0,1,500); // пауза в 1,5 сек и всегда можно выйти по нажатию на ESC
end;
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.03.2012, 13:12
Помогаю со студенческими работами здесь

Можно ли сделать бат файл, в котором будет 3 подпункта и один из подпунктов тоже будет иметь свое меню?
Можно сделать бат файл, в котором будет 3 подпункта и один из подпунктов тоже будет иметь свое меню? @Echo off :m1 Echo...

Работа с формой в Sleep
Здравствуйте! Подскажи, у меня в программе есть пара Sleepов, 1-5 секунд. Но во время слипа, форма как бы подвисает и не дает нажимать ни...

Как реализовать паузу во время выполнения программы
Как реализовать паузу во время выполнения программы

Как Sleep() считает время ?
Добрый вечер :) Из следующего кода возник один вопрос: void __fastcall TForm1::Button1Click(TObject *Sender) { ...

Как сделать паузу?
Как сделать что-бы када высвечивалось надпись окно закрывалось ТОЛЬКО если нажал какую-то клавишу а не сразу? Подскажите оператор плз! ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru