我们先看看下面一段代码:直接使用数组,即StreamConfigTable数组作为bind函数参数,PersistentStreamSettingsToDevice函数的第一个参数为数组形式StreamSetting_t StreamConfigTable[]。大家知道,数组名作为函数参数时候,实际退化为一个指针。
ReturnStatus CServiceEngine::SaveStreamConfigurations(StreamSetting_t StreamConfigTable[], int resourceStreamId , int VideoSourceIndex, PelcoStreamSetting_type_e SettingType)
{
TRACE("%s, %d, Start a thread to save stream configurations:%d", __FUNCTION__, __LINE__,resourceStreamId);
boost::thread boost_thread( boost::bind(&CServiceEngine::PersistentStreamSettingsToDevice, this, StreamConfigTable, resourceStreamId ,VideoSourceIndex ) );
boost_thread.detach();
return SYS_OK;
}
测试结果,当在PersistentStreamSettingsToDevice函数中直接以StreamConfigtable[i],即数组下表引用时,编译可以通过,但运行时出现段错误。
于是猜测:boost::bind函数的参数对对象数组这种指针参数的支持不够好。
为了验证,将PersistentStreamSettingsToDevice函数的第一个参数又数组形式改为容器形式:vector<PelcoStreamSetting_t> StreamConfigTable。
同时上述代码调整为:
ReturnStatus CServiceEngine::SaveStreamConfigurations(StreamSetting_t StreamConfigTable[], int resourceStreamId , int VideoSourceIndex, PelcoStreamSetting_type_e SettingType)
{
int i =0;
vector<PelcoStreamSetting_t> ConfigTable;
for ( i= SETTING_ENCODING; i<SETTING_END; i++ )
{
ConfigTable.push_back(StreamConfigTable[i]);
}
TRACE("%s, %d, Start a thread to save stream configurations:%d", __FUNCTION__, __LINE__,resourceStreamId);
boost::thread boost_thread( boost::bind(&CServiceEngine::PersistentStreamSettingsToDevice, this,ConfigTable, resourceStreamId ,VideoSourceIndex ) );
boost_thread.detach();
return SYS_OK;
}
测试结果:程序编译通过,运行也正常。
难道boost::bind函数对数组的支持真的不够好?
欢迎知情者指教!