不時見到有人會這樣做:
那麼,如何使用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文件中,術語 可重入 與 執行緒安全 被用來說明乙個函式如何用於多執行緒程式。假如乙個類的任何函式在此類的多個不同的例項上,可以被多個執行緒同時呼叫,那麼這個類被稱為是 可重入 的。假如不同的執行緒作用在同乙個例項上仍可以正常工作,那麼稱之...