我正在QT框架中的數據記錄器上工作。我打算將日誌字符串保存到文件並在單獨的觀察器線程中打印到控制檯。在那個單獨的線程中,我需要爲添加的新項目觀察我的QStringList。如果有新項目,我將它們排序並登錄。我想知道在Qt框架中使用什麼機制。在STD LIB我使用condition_variable
這個任務是這樣的:觀察QStringList的新項目
/*!
* \brief puts a \ref logline_t object at the end of the queue
* @param s object to be added to queue
*/
void CLogger::push_back(logline_t* s)
{
unique_lock<mutex> ul(m_mutex2);
s->queSize = m_data.size();
m_data.emplace_back(move(s));
m_cv.notify_all();
}
/*!
* \brief takes a \ref logline_t object from the beggining of the queue
* @return first \ref logline_t object
*/
CLogger::logline_t CLogger::pop_front()
{
unique_lock<mutex> ul(m_mutex2);
m_cv.wait(ul, [this]() { return !m_data.empty(); });
assert(m_data.front());
logline_t retVal = move(*m_data.front());
delete m_data.front();
m_data.front() = NULL;
m_data.pop_front();
return retVal;
}
m_cv
是條件可變對象。 QT如何獲得這個功能?我敢打賭有更多更好的方法:)。我將不勝感激所有幫助。 Ps:我知道指針函數的參數沒有被聲明,這是一箇舊代碼...:P
您可以使用標準庫/使用Qt進行提升,使用條件變量沒有任何問題。但如果你想要全部使用Qt,那麼使用信號和插槽來實現這一點。不過,這可能會變慢。你必須進行基準測試。 – krzaq
我不想觸摸這個提升。就像你說的,我想看看Qt在這裏給出了一些不錯的東西。有了信號/插槽,即使它起初看起來很明顯,但我不知道這是否是這種事情的正確選擇。我並不是說只有gui纔會使用信號/插槽,但也許我認爲qt框架中有一些專用的監視器,或者類似於freeRTOS提供的東西(當您將項目添加到隊列中時,正在解鎖等待任務)。另外我不確定信號/插槽是否較慢,總是有爭論。 – Bremen
如果你不過分關注性能(儘管它們並不可怕),信號和插槽可以實現很好的同步,無論是否是gui。我使用它們在生產中的線程之間傳遞消息(控制檯應用程序作爲服務運行)多年,現在它們很好。你沒有得到先入先出的保證,但實際上你會得到這個。如果有另一個來自Qt的同步api,那麼我不知道它。 – krzaq