Отключить захват ключей, когда программа не отвечает - PullRequest
0 голосов
/ 27 января 2012

У меня есть приложение winform, которое может перестать отвечать на запросы при тяжелых вычислениях. Например, когда пользователь нажимает клавишу F10, программа запускает тяжелые вещи и некоторое время не отвечает (я знаю, что это нежелательный способ выполнения программы, но я не хочу менять способ работы программы на момент).

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

Как отключить захват ключей в определенный момент и включить его снова?

Ответы [ 3 ]

2 голосов
/ 27 января 2012

Программа не «захватывает ключ», она ставится в очередь операционной системой, потому что ваш основной поток пользовательского интерфейса занят вашими вычислениями и ничего не обрабатывает в то время. Единственное, что я мог подумать о том, что вы могли бы сделать, - это проверить, что определенное время истекло после того, как последний запуск закончился, прежде чем разрешить другой запуск. Гадкий хак по моему скромному мнению.

Но, да, именно поэтому вы должны использовать фоновые рабочие или потоки. Использовать BackgroundWorker намного проще, чем может показаться в начале.

0 голосов
/ 27 января 2012

Я бы согласился с Джейсоном в целом - хаки и временные исправления имеют неприятную привычку превращаться в «функции» программы.

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

public bool DisableFlag { get; set; }

public void MyKeyEventHandler(object sender, EventArgs e)
{
    if (DisableFlag)
    {
        return;
    }

    // Do stuff
}

Надеюсь, это поможет!
Cheers,
Крис.

РЕДАКТИРОВАТЬ:

Думая о комментарии Кена, и это правда, событие будет поставлено в очередь, и оно будет полезно только до тех пор, пока некоторые события проходят через него. Итак, другой вариант - отключить четный обработчик, выполнив

myControl =- MyKeyEventHandler;

, а затем

myControl =+ MyKeyEventHandler;

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

0 голосов
/ 27 января 2012

В идеале вы должны использовать BackgroundWorker здесь, но, как вы сказали

Я не хочу менять способ работы программы в данный момент).

Так что я не пойду по этому пути.

Что вы можете сделать, это когда вы обнаруживаете F-10 в первый раз, устанавливаете значение bool равным true, и в следующий раз, когда вы обнаружите f-10, проверьте, является ли bool уже верным или нет. Если это уже так, не запускайте тяжелую операцию снова, просто пропустите код.

В конце тяжелой обработки снова установите bool в false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...