我們先看看下面一段代碼:直接使用數組,即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函數對數組的支援真的不夠好?
歡迎知情者指教!