powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Прервать алгоритм по Esc
18 сообщений из 43, страница 2 из 2
Прервать алгоритм по Esc
    #40112136
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
После того, как главный цикл его это сообщение обработает. Вы же не хотите повесить всю программу на всё время работы "алгоритма", не так ли?..

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

Возьмите файл размером в 1Г и попробуйте его открыть в текстовом редакторе Delphi. Среда зависнет на долгое время (возможно - навсегда). А потом попробуйте сделать то-же самое в текстовом редакторе Far. Побежит progress и его в любой момент можно прервать по Esc. И отнюдь не потому, что Far загружает файл в отдельном потоке.
...
Рейтинг: 0 / 0
Прервать алгоритм по Esc
    #40112138
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim RusovПобежит progress и его в любой момент можно прервать по Esc. И отнюдь не потому,
что Far загружает файл в отдельном потоке.

Вот только Far тоже глотает буквы "ВС" в ходе этого процесса. Увы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Прервать алгоритм по Esc
    #40112139
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
А теперь то же самое, но с потоками: пользователь жмёт "ВС" и они появляются, Esc жать не надо, проблема даже не возникла, все счастливы.

Отнюдь. После нажатия "B" алгоритм запуститься заново, а после "C" - третий раз. И мы получим все прелести реентрантности, где их вообще не планировали. Я еще раз говорю - что должно работать в потоках или асинхронно - так и работает, не нужно меня лечить. Речь идет об алгоритмах, которые могут исполняться исключительно в основном потоке по своей природе. Есть и такие, не делайте вид, что у вас все процедуры асинхронные. Delphi это не Go.
...
Рейтинг: 0 / 0
Прервать алгоритм по Esc
    #40112140
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Вот только Far тоже глотает буквы "ВС" в ходе этого процесса. Увы.

Ну, т.е. решения исходной задачи вы не знаете. Спасибо за дискуссию.
...
Рейтинг: 0 / 0
Прервать алгоритм по Esc
    #40112141
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Rusov
И отнюдь не потому, что Far загружает файл в отдельном потоке.

Правда что ли? Process Explorer с этим не согласен.

Maxim Rusov
После нажатия "B" алгоритм запуститься заново, а после "C" - третий раз. И мы получим все прелести реентрантности, где их вообще не планировали.

То есть алгоритм таки должен прерываться после нажатия любой кнопки, а не только Esc, как я и говорил выше. Чтобы не получить "все прелести реентерантности".
...
Рейтинг: 0 / 0
Прервать алгоритм по Esc
    #40112147
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim RusovПосле нажатия "B" алгоритм запуститься заново, а после "C" - третий раз.
Ну, т.е. решения исходной задачи вы не знаете.

Знаю, но оно вас не порадует, поскольку приведёт к следующему:
1. Пользователь нажимает "А", запускается алгоритм.
2. Пользователь нажимает "ВС", они не появляются.
3. Пользователь тупит, потом нажимает Esc, алгоритм прерывается.
4. ВНЕЗАПНО появляется стоявшая в очереди "В" и алгоритм снова запускается, "С"
не появляется.
5. Пользователь тупит ещё больше и нажимает Esc ещё раз, алгоритм опять прерывается.
6. СОВСЕМ ВНЕЗАПНО появляется дождавшаяся своего часа "С" и алгоритм запускается
третий раз.

Не надо так делать интерфейс. "Съядят." (с)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Прервать алгоритм по Esc
    #40112149
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Знаю, но оно вас не порадует, поскольку приведёт к следующему

Нет, такого не будет. При прерывании алгоритма все буферизированные нажатия удаляются из очереди. Это предусмотрено.

Чтобы не быть голословным:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  procedure ClearInputQueue;
  var
    vMsg :TMsg;
  begin
    while PeekMessage(vMsg, 0, WM_KeyFirst, WM_KeyLast, pm_Remove) do
      {Nothing};
    while PeekMessage(vMsg, 0, WM_MouseFirst, WM_MouseLast, pm_Remove) do
      {Nothing};
    while PeekMessage(vMsg, 0, WM_Command, WM_SysCommand, pm_Remove) do
      {Nothing};
  end;
...
Рейтинг: 0 / 0
Прервать алгоритм по Esc
    #40112151
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы не стал использовать ПО где юзеру надо ожидать окончания зависона всего интерфейса после каждого нажатия кнопки.

Причем такого длительного зависона, при котором имеет смысл нажимать ESC для отмены, когда ты устал ждать.

Более того, не удивлюсь что вот эти вот "периодические" проверки на нажатие ESC тоже, небось, имеют весьма плавающую периодичность и могут иногда и залипать.
...
Рейтинг: 0 / 0
Прервать алгоритм по Esc
    #40112153
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы все его использовали. До появления в IDE LSP
...
Рейтинг: 0 / 0
Прервать алгоритм по Esc
    #40112154
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael Longneck
Мы все его использовали. До появления в IDE LSP
Прочитай мои 2-3 строчки.
Так то любое ПО "на миллисекунду" надо ждать.

Только в таких случаях никто "нажатия кнопки для отмены нажатия кнопки" не городит, ибо оно не шибко мешает.
...
Рейтинг: 0 / 0
Прервать алгоритм по Esc
    #40112155
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Я бы не стал использовать ПО где юзеру надо ожидать окончания зависона всего интерфейса после каждого нажатия кнопки. Причем такого длительного зависона, при котором имеет смысл нажимать ESC для отмены, когда ты устал ждать.

Тогда тебе придется удалить почти все программы с компьютера. Так как почти всегда можно добиться такого эффекта при определенных условиях. Причем большинство даже не замарачиваются возможностью прерывания (а я вот заморочился).
Начни удалять с Delphi, конечно.
...
Рейтинг: 0 / 0
Прервать алгоритм по Esc
    #40112156
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Rusov,

Фантазер.
...
Рейтинг: 0 / 0
Прервать алгоритм по Esc
    #40112159
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не писал текстовых редакторов, но даже и лукапы написать так, чтобы не тормозило при больших данных для поиска не совсем тривиальное дело. Тем не менее потоки использовать.... это немного overkill. С другой стороны, если ожидаются 1GB файлы, то без потоков и вовсе делать бессмысленно. Так что это вопрос какие тут условия задачи.
...
Рейтинг: 0 / 0
Прервать алгоритм по Esc
    #40112163
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael Longneck
Я не писал текстовых редакторов, но даже и лукапы написать так, чтобы не тормозило при больших данных для поиска не совсем тривиальное дело. Тем не менее потоки использовать.... это немного overkill.
Ну так в "поделках на коленке" это все и не нужно. Потупит и пройдет.
По возможности, алгоритмически ограничивают максимальное время тупежа, да и все.

А вот в приличном ПО надо делать так что бы интерфейс не залипал, там где без этого можно обойтись.

Зачем гармонично сочетать недостатки обоих подходов для меня загадка.
...
Рейтинг: 0 / 0
Прервать алгоритм по Esc
    #40112181
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
- Запускаешь блокирующее действие
- Вешаешь плашку "Работаем... нажмите any key для завершения"
- Делаешь выборку в PeekMessage по нажатию клавиш, все, что не any key - выкидываешь (т.к. нефиг жать левые клавиши, пока софт занят важным делом)
- Профит

либо
1
2
- Делаешь выборку в PeekMessage по нажатию клавиш, все, что не any key - складируешь в отдельную очередь
- Когда действие завершится, перепощиваешь сохраненные нажатия
- Профит

А вообще, если у тебя скриптовый кусок, как ты в нём собрался вызывать PeekMessage?
...
Рейтинг: 0 / 0
Прервать алгоритм по Esc
    #40112185
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первый вариант - это и есть CheckInterrupt(1).
Вариант с буферизацией и repost'ом - думал, но пока не стал делать, обошелся GetAsyncKeyState

Fr0sT-Brutal
А вообще, если у тебя скриптовый кусок, как ты в нём собрался вызывать PeekMessage?

Ну так в нем есть цикл интерпретации из него и вызываю. Движок то - мой.
...
Рейтинг: 0 / 0
Прервать алгоритм по Esc
    #40112197
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Запускаете вычисления в отдельном потоке
2. В основном потоке вешаете модальную форму "Ждите"
3. После вычисления поток отправляет форме сообщение закрыться
4. При закрытии формы пользователем прерываем вычисления в потоке.

Получаем почти однопоточную программу с работающим GUI

При наличии желания, времени и знаний можно запускать форму в отдельном потоке, а вычисления делать в основном. Но на общий алгоритм это не влияет
...
Рейтинг: 0 / 0
Прервать алгоритм по Esc
    #40112209
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант с буферизацией и repost'ом - думал ... - теперь думай удельный вес ядра твоей планеты o MMF )

Делаешь свой редактор, - так сделай и свой "поток" и свою очередь сообщений.
...
Рейтинг: 0 / 0
18 сообщений из 43, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Прервать алгоритм по Esc
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]