ठीक है..यह लंबा होगा लेकिन मुझे पहले कुछ पृष्ठभूमि की व्याख्या करने की आवश्यकता है।मल्टीथ्रेडिंग और सीरियल पोर्ट
मेरे सॉफ़्टवेयर का यह हिस्सा कन्वेयर बेल्ट को चलाने वाली वस्तुओं को सॉर्ट करने के लिए है। मैं कन्वेयर बेल्ट के लिए मॉडबस का उपयोग कर रहा हूं। एक आइटम गेट के माध्यम से जाने के लिए मॉडबस एक विशिष्ट समय पर द्वार खोल देगा। वजन के आधार पर आइटम कुछ गेट्स के माध्यम से जायेंगे।
मैं एक सेंसर की निगरानी कर रहा हूं यह निर्धारित करने के लिए कि कोई आइटम स्केल पर कब होता है। जब सेंसर अवरुद्ध हो जाता है, तो आइटम का वजन होता है और उचित द्वार पर भेजा जाता है। टाइमर गेट को खोलने/बंद करने के लिए सेट हैं।
मेरा कोड इसके लिए काम करेगा .. समस्या यह है कि यह कई वस्तुओं के लिए काम नहीं करेगा। इसका मतलब है, जबकि एक गेट खुला है, गेट बंद होने तक सेंसर की निगरानी नहीं की जा रही है। इसलिए जब आइटम ए गेट के रास्ते पर है, तो आइटम बी को सेंसर को अवरुद्ध करते समय स्केल पर वजन नहीं मिलेगा। मेरे पास लाइन पर 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 दौरान पैमाने धागा ब्लॉक()? मैं अभी तक आपका कोड पूरी तरह समझ नहीं रहा हूं। ऐसा लगता है कि यह अभी भी बहुत प्रक्रियात्मक है, भले ही आप धागे का उपयोग कर रहे हों - ऐसा लगता है कि धागे हमेशा एक दूसरे पर इंतजार कर रहे हैं। क्या यह हो रहा है? –
एफवाईआई, यहां सी # में मल्टीथ्रेडिंग पर एक शानदार लिंक है: http://www.yoda.arachsys.com/csharp/threads/index.shtml –
यह मेरी पहली बार मल्टीथ्रेडिंग है।मुझे इसकी आवश्यकता थी जहां मेरा जीयूआई लॉक नहीं होगा। मुझे यकीन नहीं है कि "थ्रेड स्केल ब्लॉक" से आपका क्या मतलब है धागे एक-दूसरे पर इंतजार कर रहे हैं .. लेकिन जब मैंने इसे ठीक करने का प्रयास किया, तो मुझे अभी त्रुटियों का एक गुच्छा मिला (मेरा संपादन देखें)। मुझे कन्वेयर बेल्ट चलाने में सक्षम होने के लिए इस सॉफ़्टवेयर की आवश्यकता है। यह सेंसर द्वारा गुजरने वाली वस्तुओं के लिए कहने की दर पर खाता होना चाहिए ... 1 आइटम प्रत्येक 3 सेकंड। इसलिए सभी द्वार खोलने/बंद होने चाहिए क्योंकि आइटम अपने द्वार पर आता है। मुझे पता है कि यह भ्रमित लगता है..क्या आप समझते हैं कि मैं क्या करने की कोशिश कर रहा हूं? लिंक – CSharpDev