Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.14;
Скачать: CL | DM;

Вниз

Задержка, которая не вешает прогу   Найти похожие ветки 

 
tickler   (2006-04-22 12:43) [0]

Вопрос такой, как сделать задержку, но так, чтобы прога при этом не вешалась. Для задержки используется переменная, которую к тому же нужно менять из программы, то есть вручную редактировать длительность задержки во время процесса.


 
MBo ©   (2006-04-22 12:46) [1]

Цель какая? что значит - не вешалась? можно цикл с Application.Processmessages сделать (не на каждой итерации)


 
tickler   (2006-04-22 13:06) [2]


> Цель какая? что значит - не вешалась?


цель - чтобы во время паузы можно было нормально двигать окошко и нажимать кнопки. И чтобы параметр wait можно было бы при этом менять.

Щас вот так:

    if id=4 then
      begin
        Form2.Memo1.Clear;
        Application.ProcessMessages;
        sleep(wait);
      end;


 
palva ©   (2006-04-22 13:16) [3]

> И чтобы параметр wait можно было бы при этом менять.
А как программа позволит изменить параметр, если она задержана? Наверно вы под паузой понимаете задержку некоторого отдельного длинного цикла. Тогда поместите этот цикл в отдельный поток, где в цикле выполняйте вместо тела цикла Sleep, если некая глобальная переменная равна false, а установку этой глобальной переменной делайте в основном потоке, (в котором форма и элементы управления).


 
tickler   (2006-04-22 13:23) [4]

Для palva ©

Да, именно цикл и нужно приостановить на заданное время, спасибо, буду пробовать с потоками.

А может есть еще какие-нибудь способы?


 
palva ©   (2006-04-22 13:33) [5]

> А может есть еще какие-нибудь способы?
Application.ProcessMessages; ставится внутри цикла. Если это очень задерживает программу (большие интервалы между двумя последовательными вызовами Application.ProcessMessages), то можно попробовать поставить эту строку в самый внутренний цикл. Если наоборот, это делает выполнения цикла очень долгим, то можно вызывать Application.ProcessMessages не при каждом проходе цикла, а, например, каждый десятый проход. Но если вы поставите Sleep, то вся (однопоточная) программа честно зависнет, на указанное вами время.


 
Юрий Зотов ©   (2006-04-22 13:57) [6]

while MsgWaitForMultipleObjects(...) <> WAIT_TIMEOUT do...

Или организовать ожидание в отдельном потоке. Причем лучше сделать это не просто через Sleep, а через подходящий объект синхронизации.


 
Leonid Troyanovsky ©   (2006-04-22 14:26) [7]


> Юрий Зотов ©   (22.04.06 13:57) [6]

> Или организовать ожидание в отдельном потоке.


Или даже в первичном:

http://rsdn.ru/Forum/Message.aspx?mid=500558&only=1

--
Regards, LVT.


 
Юрий Зотов ©   (2006-04-23 14:37) [8]

> Leonid Troyanovsky ©   (22.04.06 14:26) [7]

Собственно, MsgWaitForMultipleObjects для того и рекомендовалась.



Страницы: 1 вся ветка

Текущий архив: 2006.05.14;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.029 c
2-1145976016
vegarulez
2006-04-25 18:40
2006.05.14
Привет мастерам! Как вызвать процедуру в DataModule из Unit`a.


1-1144404671
Kolan
2006-04-07 14:11
2006.05.14
Как отладить работу COM сервера и клиента?


4-1140420446
Xerx
2006-02-20 10:27
2006.05.14
Нужен совет по использованию таймеров


2-1145852307
Westbronx
2006-04-24 08:18
2006.05.14
Работа с текстом


2-1146025378
Юрик
2006-04-26 08:22
2006.05.14
Как сделать бегущую строку???