首先,了解一下該系統重要的資料型別.
1. fqueuedthreadpool:虛基類,佇列執行緒池, fqueuedthreadpoolbase繼承自fqueuedthreadpool,
fqueuedthreadpoolbase維護了乙個tarrayqueuedwork(需要被執行的工作), tarrayallthreads(所 有的執行緒)
tarrayqueuedthreads ( 空閒的執行緒)
2. fqueuedthread繼承自frunnable, 代表了執行緒的執行體,但並非執行緒本身。乙個執行緒建立後將會執行frunnable的run()函式.
3. frunnablethread代表了執行緒本身,該類會派生出平台相關的子類,win32下對應的是frunnablethreadwin,建議讀者看看某個平台下的具體實 現。在建立時需要指定乙個frunnable,用於執行緒執行。
4. fevent: 虛基類,提供了事件操作的介面,用於執行緒的啟用掛起, 該類會派生出平台相關的子類,win32下對應的是feventwin。
兩個重要介面: wait()將會使執行緒掛起,trigger()將會啟用執行緒,配對使用。
了解了相關的資料型別後,可以開始剖析多執行緒任務系統的流程了,先從asyncwork.h開始。
asyncwork.h中有幾個使用多執行緒任務系統的例子,先來了解我們如何使用多執行緒來執行任務。
大體流程如下:
先自定義乙個任務類,用於執行我們的任務
class exampleautodeleteasynctask : public fnonabandonabletask
//任務模板類,其作用是託管我們自定義的任務類,如執行完任務後自動銷毀.
template
class fautodeleteasynctask : private iqueuedwork
if (queuedpool)
else
}void dowork()
virtual void dothreadedwork()
void startsynchronoustask()
void startbackgroundtask()
//使用多執行緒任務的例子
void example()
如何使用多執行緒來執行任務已經展示完了,就是這麼easy!
接下來分析多執行緒來執行流程,重點是queuedpool例項化時做了什麼 以及 queuedpool->addqueuedwork(this);
我們先看一下queuedpool例項是如何得到的:queuedpool = gthreadpool; 而gthreadpool是在引擎初始化的時候建立的,**在launchengineloop檔案裡,如下:
if (fplatformprocess::supportsmultithreading())
gthreadpool 建立之後便呼叫了它的create
gthreadpool->create(innumqueuedthreads)
}。。。。。。。
}在fqueuedthread的create介面裡,建立了平台相關的執行緒和系統事件,該執行緒的執行體是fqueuedthread的run函式.
fqueuedthread::create()
講到這裡,先小結一下,例項化gthreadpool實際上也就是建立了n個執行緒,每個執行緒都處於乙個不斷掛起,醒來,掛起的迴圈中。
這n個執行緒用於執行非同步任務,使用者需要執行自定義的任務可以參考asyncwork.h的例子。
那麼,一定在某個地方會呼叫doworkevent->trigger()使run能夠跳出死迴圈,執行後面的**。
聰明的讀者一定想到了在前面提到的 (gthreadpool等於queuedpool)queuedpool->addqueuedwork(this), 沒錯,就是它,在addqueuedwork裡面便間接呼叫了doworkevent->trigger()
queuedpool->addqueuedwork(inqueuedwork)
if (thread != nullptr)
else
queuedwork.add(inqueuedwork);
fqueuedthread::dowork(iqueuedwork* inqueuedwork)
呼叫doworkevent->trigger()之後,執行緒的run()得以繼續執行,接下來的工作便是不斷取出task來執行.
fqueuedthread::run()
}
UE4多執行緒
frunnable為我們提供了四個重要的介面 class core api frunnable virtual void exit init是對frunnable物件的初始化,它是由frunnablethread在建立執行緒物件後,進入執行緒函式的時候立即被frunnablethread呼叫的函式,...
UE4非同步程式設計專題 多執行緒
frunnable為我們提供了四個重要的介面 class core api frunnable virtual void exit init是對frunnable物件的初始化,它是由frunnablethread在建立執行緒物件後,進入執行緒函式的時候立即被frunnablethread呼叫的函式,...
UE4換裝系統
角色骨骼模型換裝原理無非就是把角色模型拆分多個部分,每部份必須使用同一套骨骼,拆解的部分根據所在骨骼空間位置找到相應父主骨骼空間位置,然後設定合成輸出。舉個簡單例子 假如把角色拆分四部分,分別如下 uskeletalmeshcomponent bodysmc 作為父主骨骼模型 uskeletalme...