2009-12-15 85 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中处理它。