C++ QT线程中的Lua脚本

C++ QT线程中的Lua脚本,c++,multithreading,qt,lua,C++,Multithreading,Qt,Lua,我正在对一个大问题(我没有)大发雷霆,但可能是一个简单的问题 我正在用QT开发一个服务器应用程序。 此服务器将接受TCP连接和特定专有以太网产品的对话 每次在此服务器上调用产品时,都会使用此新的TCP连接创建一个新线程,并以一些“常见”请求开始一个对话框 在该对话框的特定步骤中,线程需要运行Lua脚本以继续该过程:不是使用公共过程,而是针对每个产品使用特定的过程 这是我的问题: 当我运行Lua脚本时,我需要使用Thread类(当前线程)的方法。由于可以在Lua脚本中使用的C函数的外部“C”声明,

我正在对一个大问题(我没有)大发雷霆,但可能是一个简单的问题

我正在用QT开发一个服务器应用程序。 此服务器将接受TCP连接和特定专有以太网产品的对话

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

在该对话框的特定步骤中,线程需要运行Lua脚本以继续该过程:不是使用公共过程,而是针对每个产品使用特定的过程

这是我的问题:

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

如果在LUA\u FN\u X()中我想做一个“this->CClass\u FN\u X()”,我不能,因为C LUA函数没有对线程的“this”的引用

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

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


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

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


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

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


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

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


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

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


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

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

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

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