Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Прервать алгоритм по Esc  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2548
Есть множество алгоритмов которые что-то считают в основном потоке клиента. Нужно чтобы они прерывались по Esc. Внутри алгоритма периодически вызывается CheckInterrupt. Как его лучше реализовать? Пробовал 2 варианта:

  procedure CheckInterrupt;
  var
    vMsg :TMsg;
  begin
    while PeekMessage(vMsg, 0, WM_KeyFirst, WM_KeyLast, pm_Remove) do
      if (vMsg.Message = WM_KeyDown) and (vMsg.WParam = VK_Escape) then
        raise EBreak.Create('');
  end;

и
  procedure CheckInterrupt;
  begin
    if GetAsyncKeyState(VK_Escape) <> 0 then
      raise EBreak.Create('');
  end;

Оба работают, но оба имеют недостатки. Вариант с PeekMessage "съедает" все нажатия, что иногда не годится (например алгоритм может запускаться как раз для обработки нажатий. Например, что то типа автодополнения). Вариант с GetAsyncKeyState - тоже имеет заморочки. Например, он может пропускать нажатия, если CheckInterrupt вызывается недостаточно часто.

Может можно как то просканировать очередь сообщений на предмет клавиатурных нажатий, но не извлекая их из очереди? Например, для консоли есть PeekConsoleInput, но для оконной очереди я аналога не нашел.

И да, программа - на Delphi. :)
15 ноя 21, 12:56    [22396154]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
rgreat
Member

Откуда:
Сообщений: 7024
https://delphisources.ru/pages/faq/base/sys_shortcut.html
15 ноя 21, 13:30    [22396176]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2548
Не в тему. Мне не нужен глобальный hotkey. Который все равно не придет без цикла обработки сообщений.
15 ноя 21, 13:42    [22396185]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54791

Maxim Rusov
Как его лучше реализовать?

Лучше таки загнать его в поток. Но проктостоматологи могут обойтись хоткеем на
пункте меню + ProcessMessages.

Posted via ActualForum NNTP Server 1.5

15 ноя 21, 13:53    [22396192]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
rgreat
Member

Откуда:
Сообщений: 7024
Maxim Rusov,

Т.е. у тебя это все в основном потоке "интерактивно" без ProcessMessages работает?

Тогда не трахай мозги себе и окружающим и переноси расчеты в потоки.
15 ноя 21, 13:53    [22396193]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
rgreat
Member

Откуда:
Сообщений: 7024
Ну и для знатных проктостоматологов есть еще вариант посадить хук SetWindowsHookEx(WH_KEYBOARD,,) на всю винду.

Сообщение было отредактировано: 15 ноя 21, 14:05
15 ноя 21, 14:03    [22396201]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2548
То, что должно работать в потоках - работает в потоках. Никто не загоняет в потоки любой алгоритм, который _может_ работать долго. Например - у меня текстовый редактор, файл может быть большой. Его открытие и любая блочная операция _может_ работать долго и должна быть прерываемой. Но никто в здравом уме не будет делать многопоточный текстовый редактор.

Все кто на любой вопрос про длительные процессы отвечают "используй потоки" - обычно бла-бла, сами даже понятия не имеют, насколько это сложно.
15 ноя 21, 14:07    [22396202]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54791
Maxim Rusov
обычно бла-бла, сами даже понятия не имеют, насколько это сложно.

На практике это обычно гораздо проще, чем думают чайники. Главное - потоки
запускать, используя beginthreadex, а не TThread. Хотя да, у чайников обычно есть проблема с пониманием, что процедура потока может начать (и даже закончить) выполняться раньше, чем вызывающая программа её дойдёт до следующей после beginthreadex строчки.

Вариант с шорткатом на экшоне, устанавливающем переменную "прервись", и
ProcessMessages я уже назвал.

Сообщение было отредактировано: 15 ноя 21, 14:15
15 ноя 21, 14:12    [22396203]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2548
Dimitry Sibiryakov
На практике это обычно гораздо проще, чем думают чайники.

Тут вы в корне не правы. На практике это значительно сложнее, чем обычно думают чайники.

Dimitry Sibiryakov
Вариант с шорткатом на экшоне, устанавливающем переменную "прервись", и ProcessMessages я уже назвал.


В первом посте я привел 2 работающих варианта, и объяснил чем они меня не устраивают. Вариат "с шорткатом на экшоне" как и любой другой требующий вызова ProcessMessages, будет обладать теми же недостатками что и первый CheckInterrupt, только хуже
15 ноя 21, 14:52    [22396215]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 985
OnKeyUp => Cancel := True;
Process => while not Cancel do begin Something; App.ProcessMsgs; end
15 ноя 21, 15:09    [22396222]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54791

Maxim Rusov
Вариат "с шорткатом на экшоне" как и любой другой требующий вызова
ProcessMessages, будет обладать теми же недостатками что и первый
CheckInterrupt, только хуже

Ваши объяснения недостатков первого варианта было слишком невнятным, так что я
ничего не понял. Кто съедает, куда съедает, зачем съедает. Первый вариант
работает так как написан, а написал он именно с PM_REMOVE.

Если "алгоритм может запускаться как раз для обработки нажатий", то
ProcessMessages это именно то, что нужно, ибо доставит ему (алгоритму) эти нажатия.

PS: Таки да, и открытие файла и поиск в тексте с лёгкостью загоняются в потоки.

Posted via ActualForum NNTP Server 1.5

15 ноя 21, 15:14    [22396224]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
rgreat
Member

Откуда:
Сообщений: 7024
Dimitry Sibiryakov
Главное - потоки запускать, используя beginthreadex, а не TThread.
А мне больше решения из System.Threading нравяться.
15 ноя 21, 15:21    [22396229]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2548
Dimitry Sibiryakov
Кто съедает, куда съедает, зачем съедает.

"Съедает" пользовательский ввод. Пользователь нажал "A" - запустился алгоритм поиска по "А" чтобы вывести автодополнение. Пользователь не глядя нажал "B" - алгоритм его съел в процессе CheckInterrupt. Пользователь ругается - нажатие потерялось.

Dimitry Sibiryakov
...и открытие файла и поиск в тексте с лёгкостью загоняются в потоки...

А модификация текста?
15 ноя 21, 15:23    [22396232]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
Dimitry Sibiryakov
Главное - потоки запускать, используя beginthreadex, а не TThread.
Почему?
15 ноя 21, 15:31    [22396234]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54791

Maxim Rusov
"Съедает" пользовательский ввод. Пользователь нажал "A" - запустился алгоритм
поиска по "А" чтобы вывести автодополнение. Пользователь не глядя нажал "B" -
алгоритм его съел в процессе CheckInterrupt. Пользователь ругается - нажатие
потерялось.

Не так не надо бездумно копипастить код в который кто-то другой с совсем другими
намерениями поместил PM_REMOVE.
И да, поиск для вывода автодополнения отлично работает в потоке. Если успел
найти до нажатия следующей кнопки - присылает вызвавшему окну результат. Не
успел - начинает заново.

Maxim Rusov
А модификация текста?

Легко. Главное решить заблокировать ли действия пользователя на это время или
как-то разруливать их параллельно, поскольку текст, дёргающийся при модификации,
обычно раздражает пользователя, пытающегося его параллельно набирать. Но есть и
исключения, как, например, автоперевод хираганы/катаканы в канджи при наборе.

Posted via ActualForum NNTP Server 1.5

15 ноя 21, 15:33    [22396236]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54791

_Vasilisk_
Почему?

Ясность мысли. В мозгу не возникает иллюзии "поток это объект". Впрочем,
TThread.CreateAnonymousThread.Start (именно в таком виде) тоже сойдёт если без
лямбд.

Posted via ActualForum NNTP Server 1.5

15 ноя 21, 15:38    [22396237]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2548
Dimitry Sibiryakov
Не так не надо бездумно копипастить код в который кто-то другой с совсем другими намерениями поместил PM_REMOVE.

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

Dimitry Sibiryakov
Maxim Rusov
А модификация текста?

Легко. Главное решить заблокировать ли действия пользователя на это время или
как-то разруливать их параллельно

Это совсем не главное. Главное что теперь у вас в разных потоках модифицируются общие структуры данных и это нужно разруливать критическими секциями. Иначе у вас не текст будет дергаться, а вполне конкретные AV посыпятся.
15 ноя 21, 16:17    [22396261]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54791

Maxim Rusov
причина PM_REMOVE в этом коде очевидна, без нее проверка зациклится.

Почему она должна зациклиться? Да, если в очереди будут нажатия других кнопок,
они будут сканироваться раз за разом, но сам по себе цикл сканирования очереди
завершится, когда переберёт все клавиатурные сообщения в ней. Ах да, там же
кто-то забыл его ограничить только клавиатурными сообщениями...

Maxim Rusov
Главное что теперь у вас в разных потоках модифицируются общие
структуры данных и это нужно разруливать критическими секциями.

Зависит от природы "общих структур данных". Но даже если и так, у вас какая-то
личная ненависть к критическим секциям?

Posted via ActualForum NNTP Server 1.5

15 ноя 21, 16:24    [22396265]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1592
Maxim Rusov,

если алгоритм обрабатывает нажатия, значит где-то еще есть PeekMessage/GetMessage, значит надо сделать PeekMessage с no remove и если там Esc, то вынуть из очереди и прервать, а если нет, то пусть дальше обрабатывается.
Но вообще, согласен, выглядит как правильнее в поток убрать.
15 ноя 21, 16:24    [22396266]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2548
Dimitry Sibiryakov

Почему она должна зациклиться? Да, если в очереди будут нажатия других кнопок,
они будут сканироваться раз за разом, но сам по себе цикл сканирования очереди
завершится, когда переберёт все клавиатурные сообщения в ней.

Как же он завершится, когда он будет постоянно возвращать первое сообщение в очереди?
Dimitry Sibiryakov
Ах да, там же кто-то забыл его ограничить только клавиатурными сообщениями...

Почему? Там же стоит WM_KeyFirst, WM_KeyLast.
Maxim Rusov
у вас какая-то личная ненависть к критическим секциям?

Проанализировать все алгоритмы на предмет из какого потока они могут вызываться, определить набор ресурсов, которые нужно защитить критическими секциями, правильно расставить эти секции, чтобы не нарваться на Deadlock... Что вы там говорили насчет чайников?
И главное - зачем? Алгоритм все равно не распараллеливается и является асинхронным. Даже исходная задача с прерыванием по Esc - не решается, собственно.
15 ноя 21, 17:00    [22396291]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2548
Zelius
значит надо сделать PeekMessage с no remove и если там Esc, то вынуть из очереди и прервать, а если нет, то пусть дальше обрабатывается

Еще раз. Алгоритм запустился по нажатию кнопки "А" и что-то долго считает. Возможно, завис, его не я пишу - это скриптовой алгоритм. Пользователь жмет "BC" - смотрит, а буквы не появляются. Жмет Esc, чтобы алгоритм прервать. Если в очереди сидят "B" и "C" то про нажатие Esc нельзя узнать, не выбрав предыдущие нажатия и тем самым разрушив очередь. Ну - или я не знаю, как это сделать.
15 ноя 21, 17:07    [22396299]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54791

Maxim Rusov
Как же он завершится, когда он будет постоянно возвращать первое сообщение в
очереди?

После того, как главный цикл его это сообщение обработает. Вы же не хотите
повесить всю программу на всё время работы "алгоритма", не так ли?..

Maxim Rusov
Даже исходная задача с прерыванием по Esc - не решается, собственно.

Как раз решается: нажатие Esc штатным образом обрабатывается циклом выборки
сообщения и может делать всё, что нужно, включая сигнализацию алгоритму о
необходимости прерваться.

Maxim Rusov
Проанализировать все алгоритмы на предмет из какого потока они
могут вызываться, определить набор ресурсов, которые нужно защитить критическими
секциями, правильно расставить эти секции, чтобы не нарваться на Deadlock... Что
вы там говорили насчет чайников?

Даже чайник справится с определением "любое обращение к глобальному объекту" и
"только непосредственно на время обращения к этому объекту".

Posted via ActualForum NNTP Server 1.5

15 ноя 21, 17:16    [22396302]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1592
Maxim Rusov,

считывай все сообщения, а затем посылай их обратно )
15 ноя 21, 17:20    [22396303]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1592
Maxim Rusov,

еще костыль - делаешь отдельный поток который раз в 100мс проверяет GetAsyncKeyState и ставит флаг в основном ))
15 ноя 21, 17:22    [22396304]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54791

Maxim Rusov
Алгоритм запустился по нажатию кнопки "А" и что-то долго считает. Возможно,
завис, его не я пишу - это скриптовой алгоритм. Пользователь жмет "BC" -
смотрит, а буквы не появляются.

А теперь то же самое, но с потоками: пользователь жмёт "ВС" и они появляются,
Esc жать не надо, проблема даже не возникла, все счастливы.

Posted via ActualForum NNTP Server 1.5

15 ноя 21, 17:22    [22396305]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2548
Dimitry Sibiryakov
После того, как главный цикл его это сообщение обработает. Вы же не хотите повесить всю программу на всё время работы "алгоритма", не так ли?..

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

Возьмите файл размером в 1Г и попробуйте его открыть в текстовом редакторе Delphi. Среда зависнет на долгое время (возможно - навсегда). А потом попробуйте сделать то-же самое в текстовом редакторе Far. Побежит progress и его в любой момент можно прервать по Esc. И отнюдь не потому, что Far загружает файл в отдельном потоке.
15 ноя 21, 17:30    [22396311]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54791

Maxim Rusov
Побежит progress и его в любой момент можно прервать по Esc. И отнюдь не потому,
что Far загружает файл в отдельном потоке.

Вот только Far тоже глотает буквы "ВС" в ходе этого процесса. Увы.

Posted via ActualForum NNTP Server 1.5

15 ноя 21, 17:34    [22396314]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2548
Dimitry Sibiryakov
А теперь то же самое, но с потоками: пользователь жмёт "ВС" и они появляются, Esc жать не надо, проблема даже не возникла, все счастливы.

Отнюдь. После нажатия "B" алгоритм запуститься заново, а после "C" - третий раз. И мы получим все прелести реентрантности, где их вообще не планировали. Я еще раз говорю - что должно работать в потоках или асинхронно - так и работает, не нужно меня лечить. Речь идет об алгоритмах, которые могут исполняться исключительно в основном потоке по своей природе. Есть и такие, не делайте вид, что у вас все процедуры асинхронные. Delphi это не Go.
15 ноя 21, 17:37    [22396315]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2548
Dimitry Sibiryakov
Вот только Far тоже глотает буквы "ВС" в ходе этого процесса. Увы.

Ну, т.е. решения исходной задачи вы не знаете. Спасибо за дискуссию.
15 ноя 21, 17:39    [22396316]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54791
Maxim Rusov
И отнюдь не потому, что Far загружает файл в отдельном потоке.

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

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

То есть алгоритм таки должен прерываться после нажатия любой кнопки, а не только Esc, как я и говорил выше. Чтобы не получить "все прелести реентерантности".

К сообщению приложен файл. Размер - 22Kb
15 ноя 21, 17:43    [22396317]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54791

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

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

Не надо так делать интерфейс. "Съядят." (с)

Posted via ActualForum NNTP Server 1.5

15 ноя 21, 17:53    [22396325]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2548
Dimitry Sibiryakov
Знаю, но оно вас не порадует, поскольку приведёт к следующему

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

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

  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;


Сообщение было отредактировано: 15 ноя 21, 17:57
15 ноя 21, 17:56    [22396328]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
rgreat
Member

Откуда:
Сообщений: 7024
Я бы не стал использовать ПО где юзеру надо ожидать окончания зависона всего интерфейса после каждого нажатия кнопки.

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

Более того, не удивлюсь что вот эти вот "периодические" проверки на нажатие ESC тоже, небось, имеют весьма плавающую периодичность и могут иногда и залипать.

Сообщение было отредактировано: 15 ноя 21, 18:01
15 ноя 21, 17:59    [22396331]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Michael Longneck
Member

Откуда: Москва
Сообщений: 2386
Мы все его использовали. До появления в IDE LSP
15 ноя 21, 18:01    [22396334]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
rgreat
Member

Откуда:
Сообщений: 7024
Michael Longneck
Мы все его использовали. До появления в IDE LSP
Прочитай мои 2-3 строчки.
Так то любое ПО "на миллисекунду" надо ждать.

Только в таких случаях никто "нажатия кнопки для отмены нажатия кнопки" не городит, ибо оно не шибко мешает.

Сообщение было отредактировано: 15 ноя 21, 18:04
15 ноя 21, 18:03    [22396335]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2548
rgreat
Я бы не стал использовать ПО где юзеру надо ожидать окончания зависона всего интерфейса после каждого нажатия кнопки. Причем такого длительного зависона, при котором имеет смысл нажимать ESC для отмены, когда ты устал ждать.

Тогда тебе придется удалить почти все программы с компьютера. Так как почти всегда можно добиться такого эффекта при определенных условиях. Причем большинство даже не замарачиваются возможностью прерывания (а я вот заморочился).
Начни удалять с Delphi, конечно.
15 ноя 21, 18:04    [22396336]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
rgreat
Member

Откуда:
Сообщений: 7024
Maxim Rusov,

Фантазер.
15 ноя 21, 18:05    [22396337]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Michael Longneck
Member

Откуда: Москва
Сообщений: 2386
Я не писал текстовых редакторов, но даже и лукапы написать так, чтобы не тормозило при больших данных для поиска не совсем тривиальное дело. Тем не менее потоки использовать.... это немного overkill. С другой стороны, если ожидаются 1GB файлы, то без потоков и вовсе делать бессмысленно. Так что это вопрос какие тут условия задачи.
15 ноя 21, 18:08    [22396340]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
rgreat
Member

Откуда:
Сообщений: 7024
Michael Longneck
Я не писал текстовых редакторов, но даже и лукапы написать так, чтобы не тормозило при больших данных для поиска не совсем тривиальное дело. Тем не менее потоки использовать.... это немного overkill.
Ну так в "поделках на коленке" это все и не нужно. Потупит и пройдет.
По возможности, алгоритмически ограничивают максимальное время тупежа, да и все.

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

Зачем гармонично сочетать недостатки обоих подходов для меня загадка.

Сообщение было отредактировано: 15 ноя 21, 18:22
15 ноя 21, 18:16    [22396345]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Fr0sT-Brutal
Member

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

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

А вообще, если у тебя скриптовый кусок, как ты в нём собрался вызывать PeekMessage?
15 ноя 21, 19:06    [22396368]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2548
Первый вариант - это и есть CheckInterrupt(1).
Вариант с буферизацией и repost'ом - думал, но пока не стал делать, обошелся GetAsyncKeyState

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

Ну так в нем есть цикл интерпретации из него и вызываю. Движок то - мой.
15 ноя 21, 19:19    [22396374]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
1. Запускаете вычисления в отдельном потоке
2. В основном потоке вешаете модальную форму "Ждите"
3. После вычисления поток отправляет форме сообщение закрыться
4. При закрытии формы пользователем прерываем вычисления в потоке.

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

При наличии желания, времени и знаний можно запускать форму в отдельном потоке, а вычисления делать в основном. Но на общий алгоритм это не влияет
15 ноя 21, 20:14    [22396388]     Ответить | Цитировать Сообщить модератору
 Re: Прервать алгоритм по Esc  [new]
Bred eFeM
Member

Откуда:
Сообщений: 573
Вариант с буферизацией и repost'ом - думал ...
- теперь думай удельный вес ядра твоей планеты o MMF )

Делаешь свой редактор, - так сделай и свой "поток" и свою очередь сообщений.
15 ноя 21, 21:28    [22396406]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить