0
私はlibmodbusライブラリを使用しています。私はスレッド間でmodbus_tポインタのインスタンスを渡す必要があります。私は生のポインタだけでは問題があります。私はboost_shared_ptrをカスタムディレターで使用して問題を解決できると思います。ブースト共有ポインタカスタムデリータの例
コンパイラの問題はありませんが、プログラムを実行するとクラッシュします。 私は誰かが私にカスタムのデリゲーターを使ってブースト共有ポインターの使用例を与えることができればと思っていました。
OpenModBusConnection()関数でm_mb.reset()が初めて呼び出されたときにプログラムがクラッシュします。私が手
m_mb = boost::shared_ptr<modbus_t>(modbus_new_rtu(m_heatercomport.c_str(),9600,'N',8,1), freemodbus);
void freemodbus(modbus_t *mb)
{
if(mb != NULL)
{
modbus_close(mb);
modbus_free(mb);
}
}
void OpenModBusConnection()
{
if(m_mb.get() != NULL)
{
wxString msg("Closing port \"");
msg.append(m_heatercomport);
msg.append("\" modbus port ");
wxLogMessage(msg);
readoutput->AppendText("Modbus Connection Closed\n");
m_mb.reset();
}
// open modbus connection
m_mb.reset();
modbus_set_slave(m_mb.get(),1);
if(modbus_connect(m_mb.get()) == -1)
{
wxString msg("Failed to open port \"");
msg.append(m_heatercomport);
msg.append("\" modbus port ");
wxLogMessage(msg);
readoutput->AppendText("Modbus Connection Failed\n");
return false;
}
else
{
wxString msg("Opening port \"");
msg.append(m_heatercomport);
msg.append("\" modbus port ");
wxLogMessage(msg);
readoutput->AppendText("Modbus Connection Established\n");
return true;
}
}
エラーメッセージは、解放し、新鮮なMODBUSのハンドルに戻ってm_mb
をリセットしたい場合はこれが効果的に
m_mb.reset();
modbus_set_slave(nullptr,1);
if(modbus_connect(nullptr) == -1)
と同じである
First-chance exception at 0x7717bb47 in test.exe: 0xC0000008: An invalid handle was specified.