delphi sleep без зависания

Мне нужен способ приостановить выполнение функции в течение нескольких секунд. Я знаю, что могу использовать метод sleep для этого, но этот метод «замораживает» приложение во время его выполнения. Я также знаю, что я могу использовать что-то вроде кода ниже, чтобы избежать замораживания:

Есть две проблемы такого подхода: один из них заключается в том, что замораживание все еще происходит каждую секунду, а вторая проблема — вызов «application.processmessages» каждую секунду. Мое приложение имеет интенсивность процессора, и каждый вызов процесса вызывает много ненужной работы, которая использует излишнюю мощность ЦП; я просто хочу приостановить рабочий процесс, не более того.

То, что мне действительно нужно, было бы способом приостановить выполнение так же, как TTimer, в приведенном ниже примере:

Проблема такого подхода — «myfunction» не будет ждать mytimer, он будет запускаться сразу после включения mytimer.

Есть ли другой подход для достижения такой паузы, как я хочу?

Как сказал Дэвид, лучшим вариантом является переместить работу в отдельный поток и полностью блокировать основной поток. Но если вы должны заблокировать основной поток, то, по крайней мере, вы должны вызывать только ProcessMessages() , когда на самом деле есть сообщения, ожидающие обработки, и пусть поток спящий остальное время. Вы можете использовать MsgWaitForMultipleObjects() для обработки этого, например:

Всем, часто приходилось использовать в Delphi Функцию Sleep, в результате которой программа не отвечает N количество миллисекунд затормаживая процесc, предлагаю использовать альтернативу:

procedure pause(col:integer);
var wtim:ttime;
begin
wtim:=encodetime(0,0,col,0)+time;
repeat
application.processmessages;
sleep(10);
until time>=wtim;
end;

col — пауза в секукндах.

При использовании данной функции, программа не будет уходить в Даун, а будет дальше функционировать.

Пример 1:

В приведенном выше примере программа уйдёт в Даун на 5 секунд и будет не доступна, после вывода сообщения «Привет«

Читайте также:  hp deskjet 5520 series картриджи

I need a way to pause the execution of a function for some seconds. I know i can use the sleep method to do it, but this method ‘freezes’ the application while its execution. I also know i can use something like the code below to avoid freezing :

There are two problems of this approach : one is the fact the freezing still occurs each one second and the second problem is the calling to ‘application.processmessages’ each second. My app is CPU intensive and each processmessages call do a lot of unnecessary work that uses unnecessary CPU power ; i just want to pause the workflow, nothing more.

What i really need would be a way to pause the execution just like a TTimer, in the example below :

The problem of this approach is ‘myfunction’ won’t wait the for mytimer, it will run right after the mytimer is enabled.

Is there another approach to achieve a pause like i want ?

Оцените статью
Добавить комментарий

Adblock detector