-2

我已经阅读了数十篇关于 c# 和 Application.DoEvents() 中的线程的文章......仍然无法正确使用它来完成我的任务:我有一个连接到我的 COM 的控制器,这个控制器在命令上工作(我发送命令,需要等待几毫秒才能得到响应),假设响应是我想使用循环绘制每个时间间隔的数据:

  • 开始我的循环。
  • 通过 serialPort 向控制器发送命令。
    • 等待响应(等待 20 毫秒)。
    • 获取数据。
  • 每隔 100 毫秒重复一次这个循环。

这根本不想工作!我试图与其他线程上的数据控制器通信,但它似乎无法访问属于主线程的serialPort(粗略地说)。

任何帮助表示赞赏

4

3 回答 3

2

Application.DoEvents is for all it does - nothing more than a nested call to a windows (low level) message loop on the same thread. Which might easily cause recursion if you call it in in an event handler. You might consider creating your serial port object on the worker thread and communicate through threading classes (i.e. the WaitHandles and similar). Or call back to your UI thread using "BeginInvoke" and "EndInvoke" on the UI object.

于 2013-11-15T01:54:32.730 回答
0

如果您捕获 SerialPort.DataReceived 事件,然后使用 wither SerialPort.ReadLine 或 SerialPort.Read(byte[],int,int) 这些方法将在新线程上执行。我更喜欢使用互斥锁来控制对作为共享资源的字节缓冲区的访问。您是否也曾与您的设备成功通信过?如果不是除了端口设置检查 SerialPort.NewLine 属性和 SerialPort.Handshake 属性。这些设置因您尝试与之通信的设备而异。

于 2013-11-15T17:09:54.637 回答
-1

为什么一开始就用它?

看看这个页面,它可能会给你一个方向

  1. 我最喜欢的:DoEvents 是邪恶的吗?
  2. 来自 msdn 博客保持你的 UI 响应和 Application.DoEvents 的危险
  3. 从 msdn 论坛应用程序不会从对 DoEvents 的调用中返回

没有代码,将很难提供帮助。即使有代码,也可能很难提供帮助:)

我同意 gunr2171 的观点 :)

于 2013-11-15T01:52:00.133 回答