eguignier Ответов: 1

C# escape-ключ для прерывания вычислений в приложении winform


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

Но есть несколько проблем :

Событие KeyDown, настроенное в основной форме, не может быть перехвачено во время выполнения процедуры.
Событие KeyDown не может быть обнаружено до тех пор, пока вызывающий объект (функция button_Click ()) не выполнит фокусировку на основной форме.
Событие keyDown, по-видимому, можно обнаружить только тогда, когда приложение доступно, на удержании.



Итак, я ищу очень простую вещь (нажмите ESC, чтобы остановить вычисление), но мне кажется, что это трудно сделать !
Кто-нибудь может мне помочь, пожалуйста ?
Большое спасибо.

Что я уже пробовал:

Я пробовал разные решения :

Я поместил процедуру вычисления в отдельный поток, запущенный кнопкой, функция button_Click() которой заканчивается сразу же после этого. Таким образом, становится возможным обнаружение события KeyDown. Таким образом, используя флаг, можно остановить процедуру, помещенную в поток.
Проблема заключается в том, что другие задачи, которые должны были следовать за окончанием вычислений, также должны быть помещены в поток, иначе невозможно продолжить операции в основном потоке.

Другой тест : используйте низкоуровневый крючок клавиатуры (https://www.youtube.com/watch?v=f5gLsA7wX5U). Это нормально, когда он используется в основном потоке и когда приложение находится в режиме ожидания (ожидания ввода данных пользователем), но если основной поток выполняет процедуру вычисления, то событие достигается только в конце вычисления.
Поэтому я решил поместить этот низкоуровневый захват клавиатуры в другой отдельный поток. Но я не знаю, как это сделать.

F-ES Sitecore

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

0x01AA

Очень простое, но и очень грязное решение может заключаться в том, что ваша процедура расчета вызывает Application.DoEvents(); периодически.

Гораздо лучше следовать совету в комментарии выше от @fes-sitecore, чтобы вычислить в отдельном потоке, например, используя background worker или whatelse.

1 Ответов

Рейтинг:
0

#realJSOP

Многопоточность в WinForms[^]

Имейте в виду, что это 2-страничная статья.