QT QThread 多執行緒 用法一

2021-09-10 02:42:06 字數 1813 閱讀 4271

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使用執行緒來處理...