QT线程中的Lua脚本



我正在解决一个大问题,但可能很简单。

我正在QT中开发一个服务器应用程序。该服务器将接受TCP连接,并与特定的专有以太网产品进行对话。

每次在该服务器上调用产品时,都会使用这个新的TCP连接创建一个新线程,并且对话框会以一些"常见"请求开始。

在这个对话框的某个步骤,线程需要运行一个Lua脚本来继续这个过程:不是使用一个通用过程,而是为每个产品使用一个特定的过程。

这是我的问题:

当我运行Lua脚本时,我需要使用Thread类(当前线程)的方法。由于可以在Lua脚本中使用的C函数的Extern"C"声明,我无法调用当前线程的方法,因为我不知道如何编程(或背后的原理)这个交换的结构:-线程有N个方法在IP上发送数据,具体取决于协议(我们将此方法称为mythread::CClass_fn_X())-为Lua注册的函数C将被调用Lua_ FN_。这只是一个使用Lua)计算的参数调用CClass_fn_X()的网关

如果在LUA_FN_X()中我想做一个"this->CClass_FN_X()",我不能,因为C LUA函数没有引用线程的"this"。

在过去的几天里,我尝试了各种各样的方法,但我找不到一个好的解决方案(或简单的任何解决方案)来解决我的问题。

请帮帮我,我不需要代码,而只是原则。

另外,Lua解释器线程安全吗?我可以在不同的线程中分别运行Lua脚本吗?

为了回答您的最后一个问题,如果您在不同的操作系统线程中使用相同的Lua状态,那么Lua不是操作系统线程安全的,但您可以在不同的OS线程中安全地运行不同的Lua状态。

不要将操作系统线程与Lua线程混淆,Lua线程是协同程序,在相同的状态下运行。

有几种方法可以做到这一点。如果只有一个非主线程可以调用Lua脚本,那么脚本只需要知道它所属的线程对象,并在调用C++时将其作为参数提供。有很多策略可以在那里工作,但其中之一是创建一个全局变量,该变量是线程的轻用户数据(基本上是一个足以识别线程的指针或句柄)。然后,当您调用脚本时,脚本会使用该轻用户数据调用C函数:您的C函数必须假设接收到的用户数据实际上是线程的指针、句柄或整数(无论您的策略如何),这样它才能找到正确的thread实例并调用适当的方法。例如,C++端:

// tell Lua which thread: 
lua_pushlightuserdata(L, threadHandle); // threadHandle uniquely identifies thread
lua_setglobal(L, "scriptThread");
// call script:
// assumes you loaded script before and saved the compiled chunk 
// as global variable "script" (other SO question shows how to do it)
lua_getglobal(L, "script"); 
lua_pcall(L, 0, 0, 0);

和Lua脚本:

-- call C++ func: 
LUA_FN_X(scriptThread);

以及您在Lua状态下注册为Lua_FN_X:的C/C++包装函数

void cwrapper(lua_State* L)
{
Thread* thread = (Thread*)lua_touserdata(L, -1);
thread->CClass_fn_X();
}

Lua除了将一个轻用户数据传回C++之外,不能对它做太多的处理。如果您想查询各种线程方法,并且有几个线程实例可以调用Lua脚本,那么使用完整的userdata可能是值得的。

最新更新