3

好的。我有一个监控 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 为此重新启动此线程,使其成为循环

4

1 回答 1

5

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

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

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

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

于 2012-03-29T20:19:57.850 回答