【问题标题】:Lua script in QT ThreadQT 线程中的 Lua 脚本
【发布时间】:2014-01-29 11:14:06
【问题描述】:

我正在为一个大问题(但可能很简单)而烦恼(我没有)。

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

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

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

这是我的问题:

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

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

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

请帮帮我,我不需要代码,只需要这样做的原则。

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

【问题讨论】:

    标签: c++ multithreading qt lua


    【解决方案1】:

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

    不要将 OS 线程与 Lua 线程混淆,后者是协程并以相同的状态运行。

    【讨论】:

      【解决方案2】:

      有几种方法可以做到这一点。如果您只有一个可以调用 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 脚本的线程实例,那么使用完整的用户数据可能是值得的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-12
        • 1970-01-01
        • 2013-09-28
        • 2014-08-12
        • 2021-03-02
        • 2010-11-25
        • 2018-11-20
        • 2019-11-07
        相关资源
        最近更新 更多