【问题标题】:Button Click to stop a test按钮 单击以停止测试
【发布时间】:2011-06-12 16:00:26
【问题描述】:

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

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

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

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

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

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

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

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

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

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

在 Windows 7 上将 C# 与 Visual 2010 Express 结合使用。

【问题讨论】:

    标签: c# multithreading events serial-port buttonclick


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢。我让测试引擎在 BackgroundWorker 线程中运行,并使用AutoResetEvent 和 COM 端口以及来自 GUI 线程的其他通知。
    猜你喜欢
    • 2015-04-25
    • 2012-12-06
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 2020-04-11
    • 2015-10-04
    相关资源
    最近更新 更多