На главную   |  

Простые



Простые

Как в Delphi сделать паузу и в тоже время иметь контроль

От: petrovich1 Россия   Дата:  11.07.05 13:48 Оценка:

Как в Delphi сделать паузу и в тоже время иметь контроль над программой?
Допустим, я ставлю в цикле функцию Sleep(1000); но в эти 1000 миллисекунд надо продолжать получать сообщения от пользователя. Например если на 500-й миллисекунде он нажмет кнопку выхода, то надо выйти сразу, а не дожитаться, когда законатся остальные 500.

Все имена функций и классов изменены, любое совпадение является случайным.

Re: Как в Delphi сделать паузу и в тоже время иметь контроль

От: Ulin США   Дата:  11.07.05 13:54 Оценка: Здравствуйте, petrovich1, Вы писали:
P>Как в Delphi сделать паузу и в тоже время иметь контроль над программой?
P>Допустим, я ставлю в цикле функцию Sleep(1000); но в эти 1000 миллисекунд надо продолжать получать сообщения от пользователя. Например если на 500-й миллисекунде он нажмет кнопку выхода, то надо выйти сразу, а не дожитаться, когда законатся остальные 500.
1. Вынести ожидание в отдельный поток.
2. Разбить исходный интервал 1000 на 100 по 10ms, и между каждыми 10ms вызывать Application->ProcessMessages() и проверять условие остановки

... << [email protected] 1.1.4 beta 7 rev. 447>>

Re: Как в Delphi сделать паузу и в тоже время иметь контроль

Здравствуйте, petrovich1, Вы писали:
P>Как в Delphi сделать паузу и в тоже время иметь контроль над программой?
P>Допустим, я ставлю в цикле функцию Sleep(1000); но в эти 1000 миллисекунд надо продолжать получать сообщения от пользователя. Например если на 500-й миллисекунде он нажмет кнопку выхода, то надо выйти сразу, а не дожитаться, когда законатся остальные 500.
Что-то я не понимаю в чём смысл "паузы". Программа на Дельфи постоянно находится на "паузе" и оживает только по событиям. Тебе надо отрезать программу от каких-то событий на 1000 миллисекунд?

Re[2]: Как в Delphi сделать паузу и в тоже время иметь контр

От: Danchik Украина   Дата:  11.07.05 14:14 Оценка: Здравствуйте, Ulin, Вы писали:
U>Здравствуйте, petrovich1, Вы писали:
P>>Как в Delphi сделать паузу и в тоже время иметь контроль над программой?
P>>Допустим, я ставлю в цикле функцию Sleep(1000); но в эти 1000 миллисекунд надо продолжать получать сообщения от пользователя. Например если на 500-й миллисекунде он нажмет кнопку выхода, то надо выйти сразу, а не дожитаться, когда законатся остальные 500.
U>1. Вынести ожидание в отдельный поток.
U>2. Разбить исходный интервал 1000 на 100 по 10ms, и между каждыми 10ms вызывать Application->ProcessMessages() и проверять условие остановки
Насколько я знаю вызов Application->ProcessMessages() из отдельного потока даст абсолютно ничего, так как очередь сообщений для кажного потока своя.

Re[3]: Как в Delphi сделать паузу и в тоже время иметь контр

От: Ulin США   Дата:  11.07.05 14:22 Оценка: Здравствуйте, Danchik, Вы писали:
D>Здравствуйте, Ulin, Вы писали:
U>>1. Вынести ожидание в отдельный поток.
U>>2. Разбить исходный интервал 1000 на 100 по 10ms, и между каждыми 10ms вызывать Application->ProcessMessages() и проверять условие остановки
D>Насколько я знаю вызов Application->ProcessMessages() из отдельного потока даст абсолютно ничего, так как очередь сообщений для кажного потока своя.
Это были 2 разных варианта
Если вынести ожидание в отдельный поток, то никакого ProcessMessages и не нужно — сиди себе в потоке и жди от основного сигнала остановится...

... << [email protected] 1.1.4 beta 7 rev. 447>>

Re[4]: Как в Delphi сделать паузу и в тоже время иметь контр

От: Danchik Украина   Дата:  11.07.05 14:38 Оценка: Здравствуйте, Ulin, Вы писали:
U>Здравствуйте, Danchik, Вы писали:
D>>Здравствуйте, Ulin, Вы писали:
U>>>1. Вынести ожидание в отдельный поток.
U>>>2. Разбить исходный интервал 1000 на 100 по 10ms, и между каждыми 10ms вызывать Application->ProcessMessages() и проверять условие остановки
D>>Насколько я знаю вызов Application->ProcessMessages() из отдельного потока даст абсолютно ничего, так как очередь сообщений для кажного потока своя.
U>Это были 2 разных варианта
U>Если вынести ожидание в отдельный поток, то никакого ProcessMessages и не нужно — сиди себе в потоке и жди от основного сигнала остановится...
Интересно, кто же этот сигнал подаст? Основной поток? Он же занят
И кликнуть на кнопку закрытия он не может...
Тут скорее нужно решени типа:
procedure CheckForAbort; var Msg: TMsg; begin if PeekMessage(Msg, 0, WM_QUIT, WM_QUIT, PM_NOREMOVE) then Abort; end; for K := 0 to 10000 do begin {do something} ..... CheckForAbort; end;

Re[5]: Как в Delphi сделать паузу и в тоже время иметь контр

От: Ulin США   Дата:  11.07.05 17:36 Оценка: Здравствуйте, Danchik, Вы писали:
U>>Если вынести ожидание в отдельный поток, то никакого ProcessMessages и не нужно — сиди себе в потоке и жди от основного сигнала остановится...
D>Интересно, кто же этот сигнал подаст? Основной поток? Он же занят
D>И кликнуть на кнопку закрытия он не может...
Если длительная работа (Sleep в 1-м посте) идет в другом потоке, основной поток очень даже себе свободен. Висит, ловит эвенты от юзера. По заданной кнопке дергает флажок (какой-нить Terminated у TThread), а второй поток делает свое грязное дело (Sleep то бишь), и мониторит Terminated, и всего делов

Re: Как в Delphi сделать паузу и в тоже время иметь контроль

От: Аноним   Дата:  11.07.05 17:47 Оценка: +1

Здравствуйте, petrovich1, Вы писали:
P>Как в Delphi сделать паузу и в тоже время иметь контроль над программой?
P>Допустим, я ставлю в цикле функцию Sleep(1000); но в эти 1000 миллисекунд надо продолжать получать сообщения от пользователя. Например если на 500-й миллисекунде он нажмет кнопку выхода, то надо выйти сразу, а не дожитаться, когда законатся остальные 500.
Не совсем понятно, что тебе надо, но на всякий случай посмотри на
MsgWaitForMultipleObjects
Хотя особого смысла от него в однопоточном приложении нет.
Сдается мне, что тебе нужно выносить какую-ту работу в отдельный поток
и заниматься синхронизацией этих самых потоков.

Re[6]: Как в Delphi сделать паузу и в тоже время иметь контр

От: Danchik Украина   Дата:  11.07.05 17:51 Оценка: Здравствуйте, Ulin, Вы писали:
U>Здравствуйте, Danchik, Вы писали:
U>>>Если вынести ожидание в отдельный поток, то никакого ProcessMessages и не нужно — сиди себе в потоке и жди от основного сигнала остановится...
D>>Интересно, кто же этот сигнал подаст? Основной поток? Он же занят
D>>И кликнуть на кнопку закрытия он не может...
U>Если длительная работа (Sleep в 1-м посте) идет в другом потоке, основной поток очень даже себе свободен. Висит, ловит эвенты от юзера. По заданной кнопке дергает флажок (какой-нить Terminated у TThread), а второй поток делает свое грязное дело (Sleep то бишь), и мониторит Terminated, и всего делов
Вся дисскуссия сводится к такому результату:
1. Долгоиграющие процессы держать в потоках.
2. В потоках как можно чаще проверять Terminated флаг и выходить немедленно.
3. Аккуратно писать работу с GUI (дизаблить нужные кнопочки, формы etc..)

Re[2]: Как в Delphi сделать паузу и в тоже время иметь контр

От: s.ts   Дата:  11.07.05 17:58 Оценка: Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, petrovich1, Вы писали:
P>>Как в Delphi сделать паузу и в тоже время иметь контроль над программой?
P>>Допустим, я ставлю в цикле функцию Sleep(1000); но в эти 1000 миллисекунд надо продолжать получать сообщения от пользователя. Например если на 500-й миллисекунде он нажмет кнопку выхода, то надо выйти сразу, а не дожитаться, когда законатся остальные 500.
А>Не совсем понятно, что тебе надо, но на всякий случай посмотри на
А>MsgWaitForMultipleObjects
А>Хотя особого смысла от него в однопоточном приложении нет.
только одна ремарка: в данном контексте смысл использования MsgWait... в том, чтобы не заниматься синхронизацией и приложение осталось однопоточным, что не может не радовать

Re: Как в Delphi сделать паузу и в тоже время иметь контроль

От: Arsu Россия   Дата:  12.07.05 07:43 Оценка:

P>Как в Delphi сделать паузу и в тоже время иметь контроль над программой?
P>Допустим, я ставлю в цикле функцию Sleep(1000); но в эти 1000 миллисекунд надо продолжать получать сообщения от пользователя. Например если на 500-й миллисекунде он нажмет кнопку выхода, то надо выйти сразу, а не дожитаться, когда законатся остальные 500.
TTimer может отмерить время

Re: Как в Delphi сделать паузу и в тоже время иметь контроль

Здравствуйте, petrovich1, Вы писали:
P>Как в Delphi сделать паузу и в тоже время иметь контроль над программой?
P>Допустим, я ставлю в цикле функцию Sleep(1000); но в эти 1000 миллисекунд надо продолжать получать сообщения от пользователя. Например если на 500-й миллисекунде он нажмет кнопку выхода, то надо выйти сразу, а не дожитаться, когда законатся остальные 500.
procedure Delay(msec: Longint); var start, stop: Longint; begin start := GetTickCount; repeat stop := GetTickCount; Application.ProcessMessages; until (stop - start) >= msec; end; var

... << [email protected] 1.1.4 stable rev. 510>>

Re[2]: Как в Delphi сделать паузу и в тоже время иметь контр

От: Аноним   Дата:  12.07.05 18:00 Оценка:

Здравствуйте, Arsu, Вы писали:
A>TTimer может отмерить время
Пардон, но если визуальный поток остановлен через Sleep(), то никаких измерений TTimer не будет, ибо сообщения WM_TIMER просто некому будет обрабатывать.

Re[2]: Как в Delphi сделать паузу и в тоже время иметь контр

От: petrovich1 Россия   Дата:  13.07.05 09:59 Оценка: Здравствуйте, slavdon, Вы писали:
S>Здравствуйте, petrovich1, Вы писали:
P>>Как в Delphi сделать паузу и в тоже время иметь контроль над программой?
P>>Допустим, я ставлю в цикле функцию Sleep(1000); но в эти 1000 миллисекунд надо продолжать получать сообщения от пользователя. Например если на 500-й миллисекунде он нажмет кнопку выхода, то надо выйти сразу, а не дожитаться, когда законатся остальные 500.
S> S> procedure Delay(msec: Longint); S> var S> start, stop: Longint; S> begin S> start := GetTickCount; S> repeat S> stop := GetTickCount; S> Application.ProcessMessages; S> until (stop - start) >= msec; S> end; S>
Это самое красивое решение из всех, которые мнепосоветовали и использовал я именно его!!!

Все имена функций и классов изменены, любое совпадение является случайным.

Re[3]: Как в Delphi сделать паузу и в тоже время иметь контр

От: slavdon   Дата:  13.07.05 10:15 Оценка: Здравствуйте, petrovich1, Вы писали:
P>Это самое красивое решение из всех, которые мнепосоветовали и использовал я именно его!!!
http://www.delphiworld.narod.ru/dw.html

... << [email protected] 1.1.4 stable rev. 510>>

Re[3]: Как в Delphi сделать паузу и в тоже время иметь контр

От: Аноним   Дата:  13.07.05 10:56 Оценка: Здравствуйте, petrovich1, Вы писали:
P>Это самое красивое решение из всех, которые мнепосоветовали и использовал я именно его!!!

Программу, где требуется это "красивое" решение,
надо хорошо рефакторить.

Re[3]: Как в Delphi сделать паузу и в тоже время иметь контр

От: petrovich1 Россия   Дата:  13.07.05 11:04 Оценка: Здравствуйте, petrovich1, Вы писали:
P>Здравствуйте, slavdon, Вы писали:
S>>Здравствуйте, petrovich1, Вы писали:
P>>>Как в Delphi сделать паузу и в тоже время иметь контроль над программой?
P>>>Допустим, я ставлю в цикле функцию Sleep(1000); но в эти 1000 миллисекунд надо продолжать получать сообщения от пользователя. Например если на 500-й миллисекунде он нажмет кнопку выхода, то надо выйти сразу, а не дожитаться, когда законатся остальные 500.
S>> S>> procedure Delay(msec: Longint); S>> var S>> start, stop: Longint; S>> begin S>> start := GetTickCount; S>> repeat S>> stop := GetTickCount; S>> Application.ProcessMessages; S>> until (stop - start) >= msec; S>> end; S>>
P>Это самое красивое решение из всех, которые мнепосоветовали и использовал я именно его!!!
вот обсуждение проблемы на другом форуме:
http://relib.com/forums/topic.asp?pg=100&amp;id=875195

Все имена функций и классов изменены, любое совпадение является случайным.

Re[4]: Как в Delphi сделать паузу и в тоже время иметь контр

От: petrovich1 Россия   Дата:  13.07.05 11:11 Оценка: Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, petrovich1, Вы писали:
P>>Это самое красивое решение из всех, которые мнепосоветовали и использовал я именно его!!!
А>
А>Программу, где требуется это "красивое" решение,
А>надо хорошо рефакторить.
че такое "рефакторить". Аутетичность термина не определяется сходу. Мне тут вообще сказали, что Sleep — функция pure WinAPI так что все эти потоки — полная чющь

Все имена функций и классов изменены, любое совпадение является случайным.

Re[5]: Как в Delphi сделать паузу и в тоже время иметь контр

От: Аноним   Дата:  13.07.05 11:15 Оценка: Здравствуйте, petrovich1, Вы писали:
P>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, petrovich1, Вы писали:
P>>>Это самое красивое решение из всех, которые мнепосоветовали и использовал я именно его!!!
А>>
А>>Программу, где требуется это "красивое" решение,
А>>надо хорошо рефакторить.
P>че такое "рефакторить". Аутетичность термина не определяется сходу. Мне тут вообще сказали, что Sleep — функция pure WinAPI так что все эти потоки — полная чющь
"рефакторить" — это менять архитектуру твоей проги.
То, что тебе надо, наверняка можно решить нормально
без Application.ProcessMessages
А вот вывод о чуши потоков на основании того,
что Sleep — это pure WinAPI, — это очень оригинально
Пояснить сможешь? Впрочем лучше не надо...

Re[4]: Как в Delphi сделать паузу и в тоже время иметь контр

Здравствуйте, petrovich1, Вы писали:
P>>Это самое красивое решение из всех, которые мнепосоветовали и использовал я именно его!!!
P>вот обсуждение проблемы на другом форуме:
P>http://relib.com/forums/topic.asp?pg=100&amp;id=875195
Что можно сказать.. Красота решения достойна красоты постановки задачи. Браво телепатам! Подождите ...Wait...

Пока на собственное сообщение не было ответов, его можно удалить.

Заголовок:

Как развести канализацию в доме своими руками 725
Простые 658
Магазин книг
Простые 607
Услуги косметолога, визажиста, парикмахера
Простые 912
Устройство
Простые 412
Чехол для телефона: стильный аксессуар
Простые 751
6 Графчна частина
Простые 48
Простые 9
Простые 7
Простые 67
Простые 18
Простые 81
Простые 83
Простые 87
Простые 92
Простые 52


Теги:

Дизайн ногтей фото форма овал  Организационная структура на примере ооо схема  Как сделать свой рукам кирпич  Кусудамы из одного листа бумаги  Как сделать талисман серьги  Рефлекторная дуга схема с пояснением  Пластиковое покрытие для дсп своими руками  Квадроцикл своими руками обзор  Картинки с пакетами подарков  Сетка для мальков в аквариуме своими руками  Поделки для дачи из трубочек  Как сделать содержание на вордпресс  Идеи дизайн интерьера комнаты  Микроволновая печь самсунг ремонт схема  Маникюр гель лаком на дому отзывы  Схема работа над ошибками  Сексуальный макияж карих глаз фото  Прически вечерние и на юбилей  Стиль рок в макияже и прическе  Прически на длинные волосы реальные фото  

Карта сайта