1

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

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

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

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

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

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

这工作正常,除了现在我需要有一个测试通过 COM 端口重复发送消息并接收回复。该循环只能通过单击 GUI 上的按钮来终止。

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

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

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

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

4

1 回答 1

1

我认为BackgroundWorker组件可能可以帮助您解决这个问题。它旨在获取一些代码并在后台线程中运行它,并使用一种简单的取消方法(按钮调用 CancelAsync(),并且您的测试引擎将检查 CancellationPending 属性以查看它是否需要取消)。

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

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

BackgroundWorker 还支持显示进度的事件,但如果您不想使用,则不必连接它。

于 2011-01-20T18:39:37.690 回答