Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/29: Рейтинг темы: голосов - 29, средняя оценка - 4.69
 Аватар для ZElektro
0 / 0 / 0
Регистрация: 03.02.2019
Сообщений: 137
Delphi 6-7

Команды Pause и Delay вместо Sleep

02.04.2020, 19:27. Показов 6481. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем. Как известно, команда Sleep приостанавливает действие программы полностью на какое-то количество секунд. Мне же нужна пауза только в процедуре, чтобы при этом программа могла отвечать мне и во время этой паузы. Не предлагайте таймер и замысловатые циклы. Знаю, что есть команды Pause и Delay, но обе не работают, пишет, что операторы неизвестны. Может кто знает, модуль может нужно добавить в раздел Uses, например? Заранее спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.04.2020, 19:27
Ответы с готовыми решениями:

аналоги delay или pause в VB
ктонить 3нает , есть ли на ВБ аналоги delay или pause - нужно бновление свойства нек. объектов через некоторое время...

Есть ли на ВБ аналоги delay или pause?
ктонить 3нает , есть ли на ВБ аналоги delay или pause - нужно бновление свойства нек. объектов через некоторое время...

Аналог Thread.Sleep или Task.Delay
Есть ли какой-нибудь аналог функциям Thread.Sleep или Task.Delay ? Мне необходимо сделать задержку без блокирования главного потока....

22
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,329
02.04.2020, 20:40
Нету такого. Из Sleep происходит выход только по истечении указанного количества миллисекунд. Выход один - "замысловатые циклы".

Можно сделать такой цикл:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.Button2Click(Sender: TObject);
var
  d: integer;
begin
  Label2.Caption := 'Paused';
  d := 5000;
  repeat
    Dec(d, 16);
    Sleep(15);
    Application.ProcessMessages;
  until d < 0;
  Label2.Caption := '';
end;
Здесь надо предусмотреть, чтобы не было повторного входа в эту процедуру до завершения задержки.

Добавлено через 1 минуту
Возможно, я поторопился с таким решением.

ZElektro, зачем нужна такая задержка? Может, без неё можно обойтись?

Добавлено через 41 секунду
Можно действие разбить на 2 процедуры. Первую выполнить до задержки, включить таймер и вторую половину выполнить в обработчике таймера.
1
Нарушитель
10228 / 5658 / 1259
Регистрация: 12.03.2015
Сообщений: 26,227
02.04.2020, 20:51
Цитата Сообщение от ZElektro Посмотреть сообщение
команда Sleep приостанавливает действие программы полностью
Не команда, а функция.
Не программы, а треда, из которого она вызвана.
Цитата Сообщение от ZElektro Посмотреть сообщение
Мне же нужна пауза только в процедуре, чтобы при этом программа могла отвечать мне и во время этой паузы.
Для этого можно использовать побочный тред.
Колись, зачем тебе это.
1
 Аватар для ZElektro
0 / 0 / 0
Регистрация: 03.02.2019
Сообщений: 137
02.04.2020, 20:56  [ТС]
AzAtom, вся проблема в том, что у меня в процедуре этих пауз должно быть полно.

Программа - автобусный информатор. Фраза формируется из поочерёдного воспроизведения нескольких треков. В начале маршрута фраза одна, в середине другая, в конце третья. На весь маршрут таких фраз много. Фраза воспроизводится нажатием на обычную кнопку (не на "Пуск" стандартном в плеере Delphi). Вот одна из этих фраз:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Inf_Pleyer.FileName := 'Informator\44K\0_1_Priv.mp3';
Inf_Pleyer.Open;
Inf_Pleyer.Play;
Sleep (Inf_Pleyer.Length);
Inf_Pleyer.FileName := 'Informator\44K\0_2_Po_marsh.mp3';
Inf_Pleyer.Open;
Inf_Pleyer.Play;
Sleep (Inf_Pleyer.Length);
Inf_Pleyer.FileName := 'Informator\44K\0_3_Do_kon_ost.mp3';
Inf_Pleyer.Open;
Inf_Pleyer.Play;
Sleep (Inf_Pleyer.Length);
Inf_Pleyer.FileName := Inf [11];
Inf_Pleyer.Open;
Inf_Pleyer.Play;
Sleep даёт возможность сделать поочерёдное воспроизведение, чтобы при нажатии кнопки сразу не играл последний кусок фразы. Проблема в том, если мне нужно запустить следующую фразу, не дожидаясь конца предыдущей, Sleep мне этого не даст сделать, из-за паузы выполнения всей программы
0
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,329
02.04.2020, 21:00
ZElektro, это проигрывает стандартный MediaPlayer? Можно организовать воспроизведение списка, в котором фрагменты из которых состоит фраза. Тут не очень давно была такая тема про последовательное воспроизведение и оно работает на событиях от самого MediaPlayer без всяких Sleep.
0
Нарушитель
10228 / 5658 / 1259
Регистрация: 12.03.2015
Сообщений: 26,227
02.04.2020, 21:02
Цитата Сообщение от ZElektro Посмотреть сообщение
Программа - автобусный информатор.
Оу маааай!
Выкидывай TMediaPlayer, он для этого не предназначен.
Тут достаточно PlaySound().
-----------
Покажи задание на программу.
1
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,608
02.04.2020, 21:05
Цитата Сообщение от Verevkin Посмотреть сообщение
Тут достаточно PlaySound().
+100500
0
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,329
02.04.2020, 21:09
Я бы ещё посмотрел в сторону bass.dll. Там можно загрузить все нужные фрагменты и воспроизводить в любом порядке, в том числе и одновременно, и останавливать воспроизведение в любой момент. Только надо подумать, как грамотнее сделать последовательное воспроизведение фрагментов.

Добавлено через 3 минуты
Думаю, синхронный PlaySound будет хорош. И надо его поместить в отдельный поток, чтобы не замораживать всю программу, и приделать событие окончания воспроизведения и запускать воспроизведение следующего фрагмента по этому событию.
0
Нарушитель
10228 / 5658 / 1259
Регистрация: 12.03.2015
Сообщений: 26,227
02.04.2020, 21:20
Цитата Сообщение от AzAtom Посмотреть сообщение
Я бы ещё посмотрел в сторону bass.dll.
Нахрена такие сложности для такой простой программы?
ZElektro, я записал тебе видео, посмотри (во вкантакт залил). Ну и остальные в этом треде - гляньте тоже, на всякий случай.
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,608
02.04.2020, 21:24
Цитата Сообщение от AzAtom Посмотреть сообщение
Думаю, синхронный PlaySound будет хорош. И надо его поместить в отдельный поток, чтобы не замораживать всю программу, и приделать событие окончания воспроизведения и запускать воспроизведение следующего фрагмента по этому событию.
Я склеивал фрагменты во временный файл и проигрывал асинхронно.
0
Нарушитель
10228 / 5658 / 1259
Регистрация: 12.03.2015
Сообщений: 26,227
02.04.2020, 21:33
Цитата Сообщение от northener Посмотреть сообщение
Я склеивал фрагменты во временный файл и проигрывал асинхронно.
Охъёпть...

1
 Аватар для ZElektro
0 / 0 / 0
Регистрация: 03.02.2019
Сообщений: 137
02.04.2020, 21:48  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
Покажи задание на программу
Я его себе пишу, просто так, никакого задания нет.

Цитата Сообщение от Verevkin Посмотреть сообщение
ZElektro, я записал тебе видео, посмотри (во вкантакт залил)
Спасибо огромное, интересно написана . В потоках я пока вообще не разбираюсь, надо их изучать потом.

Я свыкся с плеером, вопрос в том, даст ли что-то его смена на PlaySound... Попробую что-то вроде плейлиста, как AzAtom писал.

И всё таки, Pause не работает разве? Я видел тут, подумал, что должен работать...
0
02.04.2020, 21:51

Не по теме:

Цитата Сообщение от Verevkin Посмотреть сообщение
Охъёпть...
Писал на Д1 в середине 90-х. Но исходники сохранились

0
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,329
02.04.2020, 22:02
Цитата Сообщение от ZElektro Посмотреть сообщение
Я свыкся с плеером, вопрос в том, даст ли что-то его смена на PlaySound...
PlaySound это WinApi функция, проигрывает WAVE файл, думаю, и MP3, упакованный в WAVE тоже проиграет. А его использование даст возможность не накидывать компонент медиаплеера и кучу команд для него.

Цитата Сообщение от ZElektro Посмотреть сообщение
В потоках я пока вообще не разбираюсь, надо их изучать потом.
В некоторых случаях поток это отличное решение. Поток это часть программы, которая выполняется параллельно с остальной частью программы.
Лучше всего сделать отдельный класс-потомок от TThread с функциями запуска воспроизведения списка и остановки воспроизведения. А из основной программы тогда нужно будет только вызывать функцию воспроизведения и программа при этом продолжит выполняться, а вывод фрагментов будет задаваться и контролироваться в отдельном потоке.
0
Нарушитель
10228 / 5658 / 1259
Регистрация: 12.03.2015
Сообщений: 26,227
02.04.2020, 22:12
Цитата Сообщение от ZElektro Посмотреть сообщение
Я свыкся с плеером
Ты по-русски понимаешь? Я ж говорю:
Цитата Сообщение от Verevkin Посмотреть сообщение
Выкидывай TMediaPlayer, он для этого не предназначен.
Ты прогу написать хочешь или онанизмом заниматься?
Посмотри это. Если не хочешь, тогда мне в этой теме больше делать нечего.

Добавлено через 8 минут
Цитата Сообщение от AzAtom Посмотреть сообщение
думаю, и MP3, упакованный в WAVE тоже проиграет.
mp3 c добавленным спереди RIFF-хэдером. Это и демонстрируется здеся.
0
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,329
02.04.2020, 22:30
ZElektro, вот набросал простой проигрыватель, проигрывает последовательно файлы из StringList:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
unit SmpPlay;
 
interface
 
uses
  Classes, MMSystem;
 
type
  TSimplePlayer = class(TThread)
  private
    { Private declarations }
    FOnStopPlaying: TNotifyEvent;
    FPlayList: TStringList;
  protected
    procedure Execute; override;
  public
    constructor Create(PlayList: TStrings);
    destructor Destroy; override;
    procedure StartPlay;
    property OnStopPlaying: TNotifyEvent read FOnStopPlaying write FOnStopPlaying;
  end;
 
implementation
 
{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,
 
      Synchronize(UpdateCaption);
 
  and UpdateCaption could look like,
 
    procedure TSimplePlayer.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }
 
{ TSimplePlayer }
 
constructor TSimplePlayer.Create(PlayList: TStrings);
begin
  inherited Create(true);
  FPlayList := TStringList.Create;
  FPlayList.Assign(PlayList);
end;
 
destructor TSimplePlayer.Destroy;
begin
  FPlayList.Free;
end;
 
procedure TSimplePlayer.StartPlay;
begin
  Resume;
end;
 
procedure TSimplePlayer.Execute;
var
  i: integer;
begin
  i := 0;
  while (i < FPlayList.Count) and not Terminated do begin
    PlaySound(PAnsiChar(FPlayList.Strings[i]), 0, SND_FILENAME or SND_SYNC or SND_NODEFAULT);
    Inc(i);
  end;
end;
 
end.
Вложения
Тип файла: rar Говорилка-фраз.rar (2.2 Кб, 24 просмотров)
0
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,329
02.04.2020, 22:40
Событие забыл реализовать. Вообще, зря приделал это событие.

Добавлено через 8 минут
Цитата Сообщение от Verevkin Посмотреть сообщение
mp3 c добавленным спереди RIFF-хэдером
Да, он самый.
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
03.04.2020, 00:31
Вроде ж MCI может играть звуки и сообщать о завершении?
0
Нарушитель
10228 / 5658 / 1259
Регистрация: 12.03.2015
Сообщений: 26,227
03.04.2020, 02:14
Цитата Сообщение от GoodWeather Посмотреть сообщение
Вроде ж MCI может играть звуки и сообщать о завершении?
дыа.
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,608
03.04.2020, 03:35
Цитата Сообщение от AzAtom Посмотреть сообщение
Событие забыл реализовать. Вообще, зря приделал это событие.
Действительно обработчик этого события нафиг не нужен. А вот метод для немедленного выключения звука был бы полезен.
Ну и вспоминая своё раннее, неплохо было бы добавить возможность зацикливания воспроизведения данного звука.

P.S. И всё же мой вариант уже тем был лучше, что он гарантировано не имеет пауз между фрагментами.
P.P.S. Свой вариант я делал только для стандартных RIFF, т.е. для Wav. Причем с одинаковой битностью.

Добавлено через 6 минут
Хотя немедленное выключение звука в таком варианте непонятно как красиво реализовать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.04.2020, 03:35
Помогаю со студенческими работами здесь

Помогите в правильном использовании функциq delay или sleep
вся проблема заключается в том что я не могу использовать таймер мне нужна одна из функций delay или sleep, но я так и не нашел примера их...

Разница между Thread.Sleep и await Task.Delay
Здравствуйте! Плохо понимаю разницу между использованием: Thread.Sleep(1000); //Здесь код после задержки и ...

В каком заголовочном файле находятся функции Sleep() и delay() и как правильно их использовать?
в каком хедере они находятся и как правильно их использовать Добавлено через 1 минуту дядя яндекс ничего не подсказал =(

Повторное использование команды PAUSE
Возникла такая проблема: в скрипте есть необходимость использовать команду pause несколько раз. Однако при повторном использовании этой...

Проблема с использованием команды PAUSE
Добрый вечер! Подскажите, пожалуйста в решении следующей проблему. Есть некий скрипт, который выполняет некую задачу и выдает в конце...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru