Кнопка Нажмите, чтобы остановить тест

У меня есть Test Engine, который выполняет несколько тестов, пока не будут выполнены все тесты.

У каждого тестового объекта есть методы Execute и Resume. Эти методы возвращают статус:

  • Ожидание ответа от COM-порта
  • Ожидание нажатия кнопки от пользователя
  • Тестирование завершено.

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

Затем тест может отправить сообщение через COM-порт и должен приостановиться, пока сообщение не будет получено из COM-порта. У меня есть прерывание COM-порта, которое обрабатывает сообщение, а затем вызываю метод возобновления Test Engine.

Для теста может потребоваться информация от пользователя. В этом случае тест отображает сообщение в текстовом поле, а затем возвращается. Обработчик события нажатия кнопки вызовет метод возобновления Test Engine.

Это работает нормально, за исключением того, что теперь мне нужно, чтобы тест неоднократно отправлял сообщение через COM-порт и получал ответ. Этот цикл будет прерван только нажатием кнопки в графическом интерфейсе.

Я узнал, что обработчик прерывания COM-порта работает в другом потоке, чем графический интерфейс. Тесты выполняют методы графического интерфейса пользователя с помощью делегата.

Как я могу заставить Test Engine проверять нажатие кнопки, одновременно ожидая сообщения COM-порта? Механизм тестирования должен проверять нажатие кнопки после получения сообщения через COM-порт, чтобы система сообщений оставалась синхронизированной.

Примечания:
Я думал о том, чтобы запустить Test Engine в рабочем потоке, с семафорами для сообщения, полученного из COM-порта, и еще одним семафором для кнопки остановки. Механизм тестирования ожидает семафора сообщения, просыпается, обрабатывает сообщение, а затем проверяет семафор кнопки остановки.

Использование C # с Visual 2010 Express в Windows 7.


person Thomas Matthews    schedule 20.01.2011    source источник


Ответы (1)


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

Что вам нужно сделать, так это добавить его в свою форму. Затем вы завершаете свой код тестирования COM-порта методом, который подключаете к обработчику событий DoWork рабочего.

Когда вы хотите начать работу, вызовите runWorkerAsync (). Этот рабочий код после тестирования COM-порта должен проверить свойство CancellationPending и вернуть его, если оно истинно. Как я уже упоминал, обработчик событий вашей кнопки для отмены вызывает CancelAsync () для установки этого свойства.

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

person Tridus    schedule 20.01.2011
comment
Спасибо. У меня есть Test Engine, работающий в потоке BackgroundWorker и использующий AutoResetEvent с COM-портом и для других уведомлений из потока GUI. - person Thomas Matthews; 25.01.2011