5秒ごとにシリアルポートをポーリングする(リクエストを送信してレスポンスを取得する)アプリケーションを1つ開発しました。すべてが非常にうまく機能していたので、徹底的にテストしました。
しかし、スレッド化を導入したときに、物理メモリに関するブルー スクリーン エラーが発生するか、スレッド化で以下に添付されているように、GUI 更新タスクとポーリング タスクを分離しました。
同じものを削除するにはどうすればよいか、誰かが私に提案できますか?
これは、アプリケーションを実行するたびに発生します。profic ドライバーのシリアル to USB ドライバーを使用しています。
主なアプリケーション コード
private void timer_Elapsed(object sender, ElapsedEventArgs e)
{
PollingAllMeters();
}
public void PollingAllMeters()
{
int isdbError = 0;
PollingUtility.MeterClass mData = new PollingUtility.MeterClass();
for (int index = 0; index < m_slaveID.Length; index++)
{
try
{
mData = poll.MeterOne(m_slaveID[index]);
Thread processData = new Thread(() => this.updateData(data));
processData.Start();
}
catch { MessageBox.Show("Inside polling box");
}
}
private void updateData(MeterValues data)
{
mainFormRef.updateData(data);
}
実際のリクエストとレスポンスが発生しているDLLコード
enter code here
public MeterClass MeterOne(byte meterID)
{
MeterClass data1 = new MeterClass();
//Voltage
mb.SendFc3(meterID, startAdd, register, ref value_meter); //modbus call is made here for sending and receiving response at serial port
if (mb.modbusStatus == "Read successful")
{
//do some calculation
}
else
{
// error handling code to create log file
if (mb.modbusStatus == "Error in read event")
{
isPollError = 21;
}
else if (mb.modbusStatus == "CRC error")
{
isPollError = 22;
}
else if (mb.modbusStatus == "Serial port not open")
{
isPollError = 23;
}
}
startAdd = 360;
register = 2;
value_meter = new byte[register * 2];
meterData = new byte[register * 2];
//Max demand
mb.SendFc3(meterID, startAdd, register, ref value_meter);
if (mb.modbusStatus == "Read successful")
{
//do some calculation
}
else
{
// error handling code to create log file
if (mb.modbusStatus == "Error in read event")
{
isPollError = 21;
}
else if (mb.modbusStatus == "CRC error")
{
isPollError = 22;
}
else if (mb.modbusStatus == "Serial port not open")
{
isPollError = 23;
}
}
startAdd = 496;
register = 16;
value_meter = new byte[register * 2];
meterData = new byte[register * 2];
mb.SendFc3(meterID, startAdd, register, ref value_meter);
if (mb.modbusStatus == "Read successful")
{
//do some calcualtion
}
else
{
// error handling code to create log file
if (mb.modbusStatus == "Error in read event")
{
isPollError = 21;
}
else if (mb.modbusStatus == "CRC error")
{
isPollError = 22;
}
else if (mb.modbusStatus == "Serial port not open")
{
isPollError = 23;
}
}
data1.date = DateTime.Now;
data1.Status = isPollError;
return data1; // return result to the main program
}