Qt 多執行緒之 std thread 一

2021-05-26 13:03:48 字數 1420 閱讀 6256

不時見到有人會這樣做:

那麼,如何使用pthread,而又使用qt提供的執行緒間機制呢?

本文的初衷源於此,但是使用的的是c++0x 的 std::thread,而不是直接使用unix的pthread。(既然用qt,還是盡量保證誇平台吧)

不想寫太多的文字,還是用乙個乙個的小例子來說話吧。

}int main(int argc, char *argv)

其中 mssleep 是我們自定義的乙個sleep函式:

void mssleep(int ms)

; nanosleep(&ts, null);

#endif

}

為什麼要用蹩腳的invokemethod?

qmetaobject::invokemethod(w, "setvalue", q_arg(int, i*i));

而不是直接用

w.setvalue(i*i);

qwidget and all its subclasses, are not reentrant. they can only be used from the main thread.

次執行緒到主線程的通訊,前面用的是invokemethod。有無其他辦法呢?

其實在多執行緒情況下,無論是invokemethod還是signal-slot,都是通過qt的事件系統來完成的。

看manual,注意note部分:

note: this function is thread-safe.

所以,我們可以直接使用這個它(通過自定義事件來傳遞資訊):

int value;

};class spinbox:public qspinbox

protected:

bool event(qevent *event)

return qspinbox::event(event);

}};void test1(qspinbox * w)

}int main(int argc, char *argv)

看乙個次執行緒物件傳送訊號到主線程物件的例子:

int value() const

public slots:

void setvalue(int v)

}signals:

void valuechanged(int v);

private:

int m_val;

};void test1(qspinbox * w)

}int main(int argc, char *argv)

例子本身沒有多少可多說的。當次執行緒中object物件的值發生變化是,會傳送訊號,由於訊號connect到主線程的spinbox中,所以就看到和例子一例子二完全一致的效果了。

Qt多執行緒之死鎖

目錄 一 造成死鎖的原因 現象分析 二 死鎖的概念和發生條件 三 死鎖的避免 四 避免死鎖的示例 一般性原則,每個臨界資源都需要乙個執行緒鎖來進行保護,假設有多個執行緒鎖該怎麼設計程式呢?先來看以下的乙個示例 很簡單就不加注釋了 qmutex g mutex 1 qmutex g mutex 2 c...

Qt 多執行緒之逐執行緒事件迴圈

從別的執行緒中訪問qobject子類 qobject和所有它的子類是非執行緒安全的。這包括整個的事件投遞系統。需要牢記的是,當你正從別的執行緒中訪問物件時,事件迴圈可以向你的qobject子類投遞事件。假如你呼叫乙個不生存在當前執行緒中的qobject子類的函式時,你必須用mutex來保護qobje...

Qt 多執行緒之可重入與執行緒安全

qt 多執行緒之可重入與執行緒安全是本節要介紹的內容。在qt文件中,術語 可重入 與 執行緒安全 被用來說明乙個函式如何用於多執行緒程式。假如乙個類的任何函式在此類的多個不同的例項上,可以被多個執行緒同時呼叫,那麼這個類被稱為是 可重入 的。假如不同的執行緒作用在同乙個例項上仍可以正常工作,那麼稱之...