我正在把我的头发拉出(我没有)一个大问题,但可能很简单。
我正在QT中开发一个Server应用程序。 该服务器将接受TCP连接以及与特定和专有以太网产品的对话。
每次在此服务器上调用产品时,都会使用此新TCP连接创建一个新线程,并以一些“常见”请求开始对话框。
在此对话框的某个步骤中,线程需要运行Lua脚本以继续该过程:不使用通用过程 - 而是针对每个产品的特定过程。
这是我的问题:
当我运行Lua脚本时,我需要使用Thread类的方法(当前线程)。由于可以在Lua脚本中使用的C语言的外部“C”声明,我无法调用当前线程的方法,因为我没有看到如何编程(或后面的原理)这个交换的结构: - 线程有N种方法根据协议在IP上发送数据(我们将调用此方法mythread :: CClass_fn_X()) - Lua的注册函数C将调用LUA_FN_X()。这只是一个调用CClass_fn_X()的网关,其中包含来自Lua的计算参数
如果在LUA_FN_X()中我想做一个“this-> CClass_fn_X()”,我不能,因为C LUA函数没有引用该线程的“this”。
过去几天我尝试了各种各样的事情,我找不到解决问题的好办法(或简单的任何解决方案)。
请帮帮我,我不需要代码,只是要做的原则。
另外,Lua解释器线程安全吗?我可以在不同的线程中单独运行Lua脚本吗?
答案 0 :(得分:3)
要回答你的上一个问题,如果你在不同的OS线程中使用相同的Lua状态,Lua不是OS线程安全的,但是你可以在不同的OS线程中安全地运行不同的Lua状态。
不要将操作系统线程与Lua线程混淆,后者是协同程序并以相同的状态运行。
答案 1 :(得分:0)
有几种方法可以做到这一点。如果你只有一个可以调用你的Lua脚本的非主线程,那么你的脚本只需要知道它所属的线程对象,并在调用C ++时将其作为参数提供。有许多策略可以在那里工作,但一个是你创建一个全局变量,它是你的线程的轻量级用户数据(基本上是一个足以识别线程的指针或句柄)。然后当你调用脚本时,脚本用那个轻用户数据调用你的C函数:你的C函数必须假设收到的userdata实际上是线程的指针或句柄或整数(无论你的策略如何),那么它就可以找到正确的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();
}
除了将其传递回C ++之外,Lua对轻量级用户数据无能为力。如果你想查询各种线程方法,并且你有几个可以调用Lua脚本的线程实例,那么使用完整的用户数据可能是值得的。