2012-02-24 3 views
0

У меня есть форма с несколькими кнопками на ней, и когда пользователь нажимает одну из кнопок, начинается длительный процесс (занимает до нескольких секунд). Я хочу, чтобы все последующие нажатия кнопок, которые появляются на любой другой кнопке формы, игнорируются до тех пор, пока процесс не будет завершен при нажатии кнопки. На самом деле происходит то, что последующие нажатия кнопок идут в очередь и выполняются последовательно, как процессы для каждого завершения. Я имею в виду, что если каждая кнопка выполняет функцию, которая занимает 2 секунды, и я быстро нажимаю 5 кнопок (менее чем за 2 секунды), это приводит к последовательности событий, которая занимает 10 секунд .... что я хочу сделать заключается в том, что он приводит к появлению только нажатия кнопки FIRST и занимает 2 секунды, которые выполняет активированная функция.Подавление обработки событий при работе в VB.net

Я пишу программное обеспечение, которое взаимодействует с аппаратным обеспечением через конвертер USB to UART, и я использую виртуальные COM-порты, и время имеет решающее значение. Я хочу, чтобы что-то произошло ТОЛЬКО, когда я нажимаю кнопку, а не через несколько секунд после того, как вы ставите в очередь и ожидаете завершения предыдущей операции.

ответ

1

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

+0

. Я попробую, я использовал класс рабочего класса раньше, спасибо – CHollman82

+0

Это дало мне поведение, которое я искал, спасибо. – CHollman82

0

Рассмотрите возможность простого отключения всех кнопок при запуске вашего долгого запуска и повторного включения их при завершении?

+0

Я пробовал это, и это приводит к визуальным «глюкам». Когда вы отключите кнопку, она погаснет, поэтому, когда я отключу и снова включу 2 дюжины кнопок, это выглядит ... «неправильно». Но спасибо за этот вариант, я подумаю, что последнее предложение – CHollman82

+0

Что произойдет, если вы поместите кнопки на панель, а затем отключите панель? Кнопки все еще отключены? Кроме того, я забыл детали, но не существует способа подавить чертеж, когда вы отключите все кнопки, а затем пусть все они будут отключены сразу? –

0

Существует несколько способов сделать это. Самый простой, вероятно, установить Enabled свойство вашей формы в ложь, когда первая кнопка нажата, а затем обратно к истине, когда процесс завершен:

Try 
    this.Enabled = False; 
    ... do your work 
Finally 
    this.Enabled = True; 
End Try 
+0

Это выглядит ужасно, хотя даже с помощью suspendlayout и resumelayout (которые, похоже, не работают так, как я ожидал бы их ...) – CHollman82

0

Я sugget для использования очереди в .NET ..

На каждую кнопку вы добавляете в свою очередь специальную команду или перечисление.

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

Это не раздражает пользователя кнопки отключения и их повторного использования.

я надеюсь, что это поможет

+0

Кажется, хороший вариант, но я не получаю событие вообще, пока предыдущий закончен ... Сначала я попытался использовать логический флаг, чтобы указать, что приложение занято, и я проверил этот флаг на каждом событии, и установил его и очистил его соответствующим образом, но я обнаружил, что никогда не тестировал позитив для того, чтобы быть занятым. Я считаю, что это связано с тем, что сам обработчик событий не вызывается до завершения предыдущей длительной операции. Захват событий происходит за кулисами, к которым у меня нет доступа – CHollman82

Смежные вопросы