好的..这将是漫长的,但我需要先解释一些背景。多线程和串口
我的这部分软件是分类顺着传送带上的物品。 我使用Modbus作为传送带。 Modbus将在特定时间打开门,让物品通过门。项目将根据体重通过某些门。
我监测的传感器,以确定何时产品的规模。当传感器被阻塞时,物品被称重并被发送到适当的门。定时器设置为打开/关闭门。
我的代码会为this..the问题的工作是,它不会为多个项目工作。我的意思是,当门打开时,传感器在门关闭之前不被监控。因此,当物品A在通往大门的路上时,物品B在阻塞传感器时不会在秤上称重。一次最多可以有8个项目在线上。这里是我现在运行的代码:
private void SensorThread_DoWork(object sender, DoWorkEventArgs e)
{
if (SensorThread.CancellationPending == true)
e.Cancel = true;
else
{
ReadSensor();
}
}
private void SensorThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//if sensor is blocked
if (sensorstatus == 0)
{
//the timers just start the thread
scaleTimer.Start();
}
else
{
sensorTimer.Start();
}
}
private void ScaleThread_DoWork(object sender, DoWorkEventArgs e)
{
if (ScaleThread.CancellationPending == true)
{
e.Cancel = true;
}
else
{
ReadScale();
//SaveWeight();
prevgate = gate;
gate = DetermineGate();
SetOpenDelay();
SetDuration();
}
}
private void ScaleThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//if gate = 0, this means the weight of meat on scale
//is not in any weight range. Meat runs off the end.
if (gate == 0)
{
txtStatus.Invoke(new UpdateStatusCallback(UpdateStatus), new object[] { meatweight.ToString() +
"lbs is out of range"});
sensorTimer.Start();
}
else
{
//open gate
//then close gate
}
}
这段代码工作正常,我只需要能够考虑线上的多个项目。 任何建议????
我也试过如下:
private void SensorThread_DoWork(object sender, DoWorkEventArgs e)
{
if (SensorThread.CancellationPending == true)
e.Cancel = true;
else
{
ReadSensor();
}
}
private void SensorThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
sensorTimer.Start();
}
private void ScaleThread_DoWork(object sender, DoWorkEventArgs e)
{
if (ScaleThread.CancellationPending == true)
{
e.Cancel = true;
}
else
{
//sensor blocked
if (sensorstatus == 0)
{
ReadScale();
//SaveWeight();
prevgate = gate;
gate = DetermineGate();
SetOpenDelay();
SetDuration();
//if gate = 0, this means the weight of meat on scale
//is not in any weight range. Meat runs off the end.
if (gate == 0)
{
txtStatus.Invoke(new UpdateStatusCallback(UpdateStatus), new object[] { meatweight.ToString() +
"lbs is out of range"});
}
else
{
//open gate
//close gate
}
}
}
private void ScaleThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
scaleTimer.Start();
}
当我做这个,我开始两个线程按下启动按钮时。我得到各种异常,程序最终抛出SEHException和崩溃。我得到的其他错误说“串口已经打开”或“I/O错误”。
这样的问题DetermineGate(),SetOpenDelay()和SetDuration在规模线程块()?我还没完全理解你的代码。它看起来仍然是非常程序化的,即使你正在使用线程 - 看起来像线程总是在等待着彼此。这是发生了什么? – 2012-03-28 20:31:27
仅供参考,这里是多线程在C#中有很大的联系:http://www.yoda.arachsys.com/csharp/threads/index.shtml – 2012-03-28 20:33:13
这是我第一次多线程。我需要它在我的GUI不锁定的地方。我不确定你的意思是“线程扩展块”线程正在彼此等待。但是当我试图修复它时,我只是遇到了一堆错误(请参阅我的编辑)。我需要这个软件才能运行传送带。它应该以每3秒1次的速度计算传感器传递的物品。所以所有的大门都应该在物品到达门口时打开/关闭。我知道这听起来令人困惑。你明白我想要完成什么吗?感谢您的链接 – CSharpDev 2012-03-28 20:37:57