按钮单击以停止测试

时间:2011-01-20 18:28:01

标签: c# multithreading events serial-port buttonclick

我有一个执行多个测试的测试引擎,直到所有测试都已执行。

每个测试对象都有ExecuteResume方法。这些方法返回状态:

  • 等待COM端口的回复
  • 等待用户点击按钮
  • 测试已完成。

在GUI中,用户通过单击按钮启动测试引擎。换句话说,按钮的click事件调用Test Engine的start方法。

接下来,测试可以通过COM端口发送消息,并且必须暂停,直到从COM端口收到消息。我有COM端口中断处理消息,然后调用测试引擎的恢复方法。

测试可能需要用户提供的信息。在这种情况下,测试在文本框中显示消息,然后返回。按钮的单击事件处理程序将调用测试引擎的恢复方法。

这很好用,除了现在我需要通过COM端口重复发送消息并接收回复。只有从GUI上的按钮单击才能终止此循环。

我了解到COM端口中断处理程序在与GUI不同的线程中运行。测试通过使用委托来执行GUI方法。

如何在等待COM端口消息的同时检查按钮单击测试引擎? 接收COM端口消息后,测试引擎应检查按钮是否单击,以保持消息系统同步。

备注:
我正在考虑让测试引擎在一个工作线程中运行,从COM端口接收消息的信号量和停止按钮的另一个信号量。测试引擎将挂起消息信号量,唤醒,处理消息,然后检查停止按钮信号量。

在Windows 7上使用C#和Visual 2010 Express。

1 个答案:

答案 0 :(得分:1)

我认为BackgroundWorker组件可能能够为您提供帮助。它设计用于获取一些代码并在后台线程中运行它,使用简单的取消方法(按钮调用CancelAsync(),测试引擎将检查CancellationPending属性以查看是否需要取消)。

您要做的是在表单中添加一个。然后,将一个COM端口测试代码包装在一个方法中,该方法可以连接到工作者的DoWork事件处理程序。

如果要开始工作,请调用runWorkerAsync()。测试COM端口后的工作程序代码应检查CancellationPending属性,如果为true则返回。正如我所提到的,取消的按钮事件处理程序调用CancelAsync()来设置该属性。

BackgroundWorker还支持显示进度的事件,但如果您不想使用,则不必将其挂钩。