qthread 用法**一:
qt使用movethread開啟多執行緒:
1.建立乙個基於qobejct 的類 controller(在此類中建立多執行緒的類,並啟動多執行緒)
2.建立乙個基於qobject 的類worker; (執行在單獨的執行緒中)
3.在worker類中,建立乙個槽函式doworker(); 用於執行多執行緒裡面的**,所有耗時的**全部在這個槽函式裡面執行。
4.在controller裡面將worker 的例項呼叫movetothread(qthread *thread),並連線訊號槽。並start()啟動執行緒。(為什麼使用訊號槽呼叫呢?為什麼不可以直接m_worker->signalcall()呢?)
m_worker = new worker();
m_worker->movetothread(&m_thread);
connect(&m_thread, &qthread::started, m_worker, &worker::signalcall);//多執行緒開始工作
connect(&m_thread, &qthread::finished, m_worker, &worker::deletelater);//
connect(m_worker, &worker::finished, this, &controller::stopwork);//執行緒類結束後,通知刪除
m_thread.start(); //執行緒開始
5.在controller的析構函式裡呼叫:
controller::~controller()
void controller::stopwork()
if (m_thread.isrunning())
}
controller:
controller::controller(qobject *parent) : qobject(parent)
controller::~controller()
void controller::stopwork()
if (m_thread.isrunning())
}
worker類:
worker::worker(qobject *parent)
worker::~worker()
void worker::directcall()
void worker::signalcall()
我們在worker類中有兩個函式,directcall與signalcall兩個函式,分別是對worker類的例項直接呼叫與通過訊號槽呼叫,看看有什麼不同。
result:
main controller thread id = 0x426c //主線程id
direct call thread id = 0x426c //直接呼叫,發生在的執行緒
signal slot call thread id = 0x3814 //通過訊號槽呼叫,發生的執行緒
通過結果,我們可以看到:
主線程的執行緒id為0x426c
通過訊號槽呼叫,函式執行再執行緒0x3814
可以看到,如果通過直接呼叫的話, 還是會在主線程中執行函式,與普通的函式呼叫相同。
如果通過訊號槽呼叫,則是在多執行緒中執行。這才是達到我們的目的。
結論:通過movetothread運用新執行緒中,需要通過訊號槽、事件等才能在多執行緒中執行。如果通過直接呼叫的話,則還是在主線程中執行。
QT QThread 簡單實現多執行緒
在本篇,會實現乙個非常簡單的執行緒。一.建立乙個工程 就是在qt總結第一篇介紹的,建立乙個mainwindow。二.在main.cpp中建立執行緒 整個 中,我加入了大量的注釋,很容易就可以弄懂 整個 可以分為幾步 1 建立乙個執行緒的類 2 實現類中的run函式 3 在main函式中,建立乙個針對...
QT QThread 執行緒間訊息佇列
qt 提供了良好的開發包 執行緒間也可以實現訊息佇列的方式 類似 windows postthreadmessage的工作方式。同時比普通佇列簡單的很多。但是需要稍微做特殊處理 1.cmythread 繼承 qthread,同時在建構函式中 使用 movetothread this 這可以讓發往 c...
多執行緒(一) tomcat 多執行緒
web server允許的最大執行緒連線數還受制於作業系統的核心引數設定,通常windows是2000個左右,linux是1000個左右。1.編輯tomcat安裝目錄下的conf目錄下的server.xml檔案 maxthreads 150 表示最多同時處理150個連線,tomcat使用執行緒來處理...