我在一個方法中使用了QTimer和lambda表達式,後來發現傳入的參數的值變了,找了一下,終於知道了bug的原因,錯誤代碼如下:
void ModbusManagement::checkResult(Modbus_Order order)
{
qDebug()<<"check PLC:";
qDebug()<<"order type is :"<<order.order_type<<order.boxOut_id<<order.elevatorOut_id;
QTimer* timer = new QTimer();
connect(timer,&QTimer::timeout,this,[&](){
ModbusState state = ReadData();
// if(checkErrors(state.errors))
// {
// timer.stop();
// }
qDebug()<<"order type is :"<<order.order_type<<order.boxOut_id<<order.elevatorOut_id;
switch (order.order_type) {
case MODBUS_ORDER_PUTIN:
{
qDebug()<<"in : elevator is "<<order.elevatorIn_id;
if(order.elevatorIn_id == MODBUS_ELEVATOR_ID_1)
{
if(state.elevator_1 == MODBUS_ELEVATOR_STATE_UP)
{
emit sig_jobmanager_finish(order.order_type);
timer->stop();
}
}
if(order.elevatorIn_id == MODBUS_ELEVATOR_ID_2)
{
if(state.elevator_2 == MODBUS_ELEVATOR_STATE_UP)
{
emit sig_jobmanager_finish(order.order_type);
timer->stop();
}
}
break;
}
case MODBUS_ORDER_OUT:
{
qDebug()<<"out : elevator is "<<order.elevatorIn_id;
if(order.elevatorOut_id == MODBUS_ELEVATOR_ID_1)
{
if(state.elevator_1 == MODBUS_ELEVATOR_STATE_DOWN)
{
emit sig_jobmanager_finish(order.order_type);
timer->stop();
}
}
if(order.elevatorOut_id == MODBUS_ELEVATOR_ID_2)
{
if(state.elevator_2 == MODBUS_ELEVATOR_STATE_DOWN)
{
emit sig_jobmanager_finish(order.order_type);
timer->stop();
}
}
break;
}
}
});
timer->start(500);
}
問題處在這個order參數上面,分析一下原因是:order參數已經被釋放了,因爲這個方法在跑完最後一行之後就釋放了,只有timer,this等參數還是正常的,傳入的參數order被釋放了,所以就成了亂碼;
解決方法是,lambda的參數加入order,代碼如下:
void ModbusManagement::checkResult(Modbus_Order order)
{
qDebug()<<"check PLC:";
qDebug()<<"order type is :"<<order.order_type<<order.boxOut_id<<order.elevatorOut_id;
QTimer* timer = new QTimer();
connect(timer,&QTimer::timeout,this,[&,order](){
ModbusState state = ReadData();
// if(checkErrors(state.errors))
// {
// timer.stop();
// }
qDebug()<<"order type is :"<<order.order_type<<order.boxOut_id<<order.elevatorOut_id;
switch (order.order_type) {
case MODBUS_ORDER_PUTIN:
{
qDebug()<<"in : elevator is "<<order.elevatorIn_id;
if(order.elevatorIn_id == MODBUS_ELEVATOR_ID_1)
{
if(state.elevator_1 == MODBUS_ELEVATOR_STATE_UP)
{
emit sig_jobmanager_finish(order.order_type);
timer->stop();
}
}
if(order.elevatorIn_id == MODBUS_ELEVATOR_ID_2)
{
if(state.elevator_2 == MODBUS_ELEVATOR_STATE_UP)
{
emit sig_jobmanager_finish(order.order_type);
timer->stop();
}
}
break;
}
case MODBUS_ORDER_OUT:
{
qDebug()<<"out : elevator is "<<order.elevatorIn_id;
if(order.elevatorOut_id == MODBUS_ELEVATOR_ID_1)
{
if(state.elevator_1 == MODBUS_ELEVATOR_STATE_DOWN)
{
emit sig_jobmanager_finish(order.order_type);
timer->stop();
}
}
if(order.elevatorOut_id == MODBUS_ELEVATOR_ID_2)
{
if(state.elevator_2 == MODBUS_ELEVATOR_STATE_DOWN)
{
emit sig_jobmanager_finish(order.order_type);
timer->stop();
}
}
break;
}
}
});
timer->start(500);
}