gpt4 book ai didi

C# BackgroundWorker 和 Com 端口问题

转载 作者:行者123 更新时间:2023-11-30 15:04:42 25 4
gpt4 key购买 nike

好的。我有一个监控 2 个 COM 端口的程序。一个连接到秤上,另一个连接到 modbus 板上。

我的问题出在连接到 modbus 板的 COM 端口上。我的程序每 100 毫秒读取一次传感器(在 modbus 板上)。它返回 0 或 1(通过 COM 端口)以确定传感器是否被阻塞。如果它被阻塞,信号将通过端口发送到电路板。

我的问题是我无法停止监控传感器,但在发送其他信号之前我必须确保 com 端口未被使用。

监视传感器的例程在后台工作线程上。一旦传感器触发,就会产生另一个线程,向 modbus 板发送信号。所以我需要在向电路板发送信号时暂停“传感器线程”。我该怎么做呢?

记住它是一个 BackgroundWorker,所以 Thread.Join 不是一个选项。

这是我的代码:

private void SensorThread_DoWork(object sender, DoWorkEventArgs e)
{
if (SensorThread.CancellationPending == true)
e.Cancel = true;
else
{
ReadSensor();
}
}

此线程的 RunWorkerCompleted 只是重新启动线程。以下线程不断监视“sensorstatus”以查看传感器何时被阻塞:

public void ScaleThread_DoWork(object sender, DoWorkEventArgs e)
{
if (ScaleThread.CancellationPending == true)
{
e.Cancel = true;
}
else
{
//sensor is blocked
if (sensorstatus == 0)
{
ReadScale();
prevgate = gate;
gate = DetermineGate();
//SaveData();
SetOpenDelay();
SetDuration();
//no gate was selected, meat out of range, runs off end
if (gate == 0)
{
txtStatus.Invoke(new UpdateStatusCallback(UpdateStatus), new object[] { meatweight.ToString() +
"lbs is out of range"});
}
else
{
//this triggers a thread to send a signal to the modbus board
gateTimer.Start();
}
}
}
}

为此的 RunWorkerCompleted 重新启动该线程,使其成为一个循环

最佳答案

创建一个负责所有发送操作的线程。实现一个队列,为该线程提供要发送到设备的消息。您可以使用新的 BlockingCollection<T>轻松实现。

或者,使用 TPL,创建一个 TaskScheduler有限的并行度为 1,如下所示:- http://msdn.microsoft.com/en-us/library/ee789351.aspx

现在您可以简单地触发要发送到设备的任务,它们将按顺序执行。

除非需要在发送者和读者之间传递信息,否则我会在其自己的单独线程上实现读者操作。

关于C# BackgroundWorker 和 Com 端口问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9932752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com