好的..這將是漫長的,但我需要先解釋一些背景。多線程和串口
我的這部分軟件是分類順着傳送帶上的物品。 我使用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