calling c++ function from Lua, implement sleep function

本文介绍如何从Lua脚本中调用C语言函数,包括创建包装器函数及使用Lua State参数。通过具体示例展示了实现毫秒级延时(msleep)函数的过程,并提供了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

You can’t call c function directly from Lua, you have to create a wrapper function that allows calling from Lua. In this post, shows a simple example to implement millisecond sleep function to Lua using nanosleep.

To allow function call from Lua script, your function must obey certain format. As variable passing from Lua to C and vice versa are through Lua Stack, therefore, the wrapper function must pass Lua State as the only parameter.
How about the real function call parameters? We can get it from the stack using lua_tonumber(), lua_tostring() etc. To return result of function call, we use lua_pushnumber(), lua_pushstring() etc. Because Lua function allows return more than 1 results, therefore you need tell Lua by returning an integer value.

1static int Function_Name (lua_State *L) {
2  int i = lua_tointeger(L, 1);  /* get argument */
3  /* carry on the procedures here ... */
4  lua_pushinteger(L, sin(d));  /* push result */
5  return 1;  /* number of results */
6}

We need to setup a library to contain your functions. By doing this, construct a static structure in array. Next, we load up our lib by calling luaL_openlib() and at last, to trigger a dofile().

Lets check out the sample codes on how to implement msleep function to Lua.

 

01extern "C" {
02#include "lua.h"
03#include "lualib.h"
04#include "lauxlib.h"
05}
06 
07#include<time.h>
08 
09int L_MSleep(lua_State* l)
10{
11    int milisec=0;
12    struct timespec req={0};
13    time_t sec;
14 
15    milisec=luaL_optint(l,1,0); // obtain parameter
16 
17    if (milisec==0)
18       return 0;
19 
20    sec=(int)(milisec/1000);
21 
22    milisec=milisec-(sec*1000);
23    req.tv_sec=sec;
24    req.tv_nsec=milisec*1000000L;
25 
26    while(nanosleep(&req,&req)==-1)
27         continue;
28 
29    return 1;
30}
31 
32int main()
33{
34 
35    const static struct luaL_reg misc [] = {
36        {"msleep", &L_MSleep},
37        {NULL,NULL} //must!
38    };
39 
40    lua_State *L = lua_open();
41    luaL_openlibs(L);
42    //open your lib
43    luaL_openlib(L, "misc", misc, 0);
44 
45    if (luaL_loadfile(L, "callc.lua") || lua_pcall(L, 0, 0, 0))
46        printf("error: %s", lua_tostring(L, -1));
47 
48    lua_close(L);
49 
50    return 0;
51}

From the example above, we implemented msleep() that takes only 1 parameter, and we created a library “misc” in Lua. luaL_optint() is actually a clean version of doing lua_isinteger() and lua_tointeger(). luaL_optint() takes 3 parameter,

 luaL_optint(Lua State, Stack Number, Default Value)

If the param specified by lua function call is not integer, the default value will be assigned.

So let see how we can call that from Lua script.


for i=1,9,1 do
    io.write(string.format("[%d] Hello/n",i))
    misc.msleep(1000) -- sleep 1 sec
end

Check out for more details from Programming in Lua Chapter 26 [1].

And more Lua examples here, http://cc.byexamples.com/category/lua/.

Reference:
[1] Programming In Lua, Chapter 26 #Calling C from Lua

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值