Ok .. điều này sẽ kéo dài nhưng tôi cần giải thích một số nền trước.Đa luồng và Cổng nối tiếp
Phần này của phần mềm của tôi là để sắp xếp các mục chạy xuống băng tải. Tôi đang sử dụng Modbus cho băng tải. Modbus sẽ mở các cổng tại một thời điểm cụ thể để cho một mục đi qua cổng. Vật phẩm sẽ đi qua một số cổng dựa trên trọng lượng.
Tôi đang theo dõi một cảm biến để xác định thời điểm một mục trên thang đo. Khi cảm biến bị chặn, vật phẩm được cân và gửi đến cổng thích hợp. Bộ hẹn giờ được đặt để mở/đóng cổng.
Mã của tôi sẽ hoạt động cho vấn đề này..có vấn đề, nó sẽ không hoạt động đối với nhiều mục. Bởi vì tôi có nghĩa là, trong khi một cổng được mở, cảm biến không được giám sát cho đến khi cổng được đóng lại. Vì vậy, trong khi mục A đang trên đường đến cổng, mục B sẽ không bị cân nặng trên quy mô khi nó chặn cảm biến. Tôi có thể có tối đa 8 mục trên cùng một lúc. Đây là mã tôi đang chạy ngay bây giờ:
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
}
}
Mã này hoạt động tốt, tôi chỉ cần có thể tính đến nhiều mục trên dòng. Mọi đề xuất ????
Tôi cũng đã thử như sau:
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();
}
Khi tôi đã làm điều này, tôi bắt đầu cả hai đề khi nút bắt đầu được nhấn. Tôi nhận được tất cả các loại ngoại lệ và chương trình cuối cùng ném SEHException và treo. Các lỗi khác tôi nhận được nói "Cổng nối tiếp đã được mở" hoặc "Lỗi I/O".
Có phải vấn đề mà chuỗi quy mô chặn trong khi xác định(), SetOpenDelay() và SetDuration()? Tôi chưa hoàn toàn hiểu mã của bạn. Dường như nó vẫn còn rất thủ tục ngay cả khi bạn đang sử dụng các chủ đề - có vẻ như các chủ đề luôn chờ đợi lẫn nhau. Đây có phải là những gì đang xảy ra không? –
FYI, đây là một liên kết tuyệt vời về đa luồng trong C#: http://www.yoda.arachsys.com/csharp/threads/index.shtml –
Đây là lần đầu tiên đa luồng của tôi.Tôi cần nó, nơi GUI của tôi sẽ không bị khóa. Tôi không chắc chắn những gì bạn có nghĩa là bởi "các khối quy mô thread" Các chủ đề đang chờ đợi nhau .. nhưng khi tôi cố gắng sửa chữa nó, tôi chỉ có một loạt các lỗi (xem chỉnh sửa của tôi). Tôi cần phần mềm này để có thể chạy một băng tải. Nó nên tính toán cho các mục đi qua các cảm biến với tốc độ nói ... 1 mục mỗi 3 giây. Vì vậy, tất cả các cửa nên được mở/đóng cửa khi mặt hàng đến cửa của nó. Tôi biết điều này nghe có vẻ khó hiểu .. bạn có hiểu những gì tôi đang cố gắng thực hiện không? Cảm ơn bạn đã liên kết – CSharpDev