2009-12-15 87 views
0

在我的示例應用程序中,我基本上有兩個線程。從另一個線程調用Lua函數

主線程包含一個Lua發動機(未線程安全的)和寄存器一些C++函數到該引擎。然而,其中一個函數執行時間過長(因爲它通過互聯網下載一些文件),我希望Lua引擎在下載過程中繼續執行其他內容而不會阻塞。

因此,我希望把它異步的:當downloadFile()功能從Lua調用,我創建了一個新的線程執行下載。然後,函數返回並且Lua引擎可以處理其他工作。當下載完成後,第二個線程需要告訴主線程它應該以某種方式調用一些附加功能processFile()來完成它。

這就是我現在掙扎的地方:什麼是最簡單/最乾淨的解決方案來實現這個目標?

回答

2

一個新的用戶數據對象可以通過你的downloadFile()或類似命名的功能拉開線程返回。這個新的用戶數據對象將包含線程句柄並且具有與__index條目相關聯的元表,該條目將具有用於檢查下載的完成狀態並且包含其他同步功能的功能。

可能看起來像這樣:

local a = downloadFile("foo") 

-- do other things 

a:join() -- now let the download finish 

processFile() 

或本:

local a = downloadFile("foo") 

local busywork = coroutine.create(doOtherStuff) 

while(not a:finished()) do 
    coroutine.resume(busywork) 
end 

processFile() 
+0

如果您不希望下載完成,只想在下載完成時收到通知,該怎麼辦?或者,在其他一些環境中:如果您有一些主線程並且您有第二個線程,例如以某些用戶輸入爲例,並且您希望在用戶輸入內容後立即中斷主線程?你不知道什麼時候你必須加入()這兩個線程,因爲你不知道用戶什麼時候會輸入什麼。 – Etan 2009-12-20 16:27:54

+1

'join()'只是一個可能的同步調用的例子。使用'finished()'類型的函數輪詢下載狀態仍然很簡單。 – gwell 2009-12-22 00:41:37

1

沒有集成到多線程的lua(這並不難,Lua是已經爲它做準備),你唯一的解決辦法是處理信令C++。

從你所說的,沒有在線程downloadFile和Lua任何交互()創建,並Lua中必須調用processFile()?如果沒有,什麼阻止你在C++中處理它?如果您需要通知Lua,您可以隨時使用回調函數(將其保存在註冊表中),使用C++處理信號並運行回調。

由於您的引擎不是線程安全的,我不認爲有辦法在Lua中處理它。