写了那么久的单线程程序大家一定认为Lua只能实现简单的单线程的程序,当然如果你只用lua的话只能是单线程运行,然而如果你要用多线程,就需要找一个运行平台来做,windows或者linux都可以,这里我选择windows,Lua版本为5.2.1版本。
如果不太了解windows下多线程的可以先看下createthread这个函数的用法,然后结合我的http://blog.youkuaiyun.com/xueyunf/article/details/7740157去理解下线程控制的方法来学习多线程的编写,当然这篇文章的最后会给出大家完整的示例代码,大家直接考过去运行也可以。
先说明下文件的目录结构:
这就是全部的目录结构,其中BeRequired.lua没有用到。噢,忘了说明这是个win32控制台程序,对于没有配置过Lua的同学建议随便百度一篇Lua如何配置和vs2010结合编程,这里就不废话了,当然也可以给本人留言提问。
然后让我们简单的逐个将文件的代码贴出来,首先是main.cpp的主要函数,一个average函数,一个子线程函数,一个main函数。
average函数如下:
int average(lua_State *L)
{
int n=lua_gettop(L);
double sum=0;
for (int i=1;i<=n;i++)
{
int temp = lua_tonumber(L,i);
sum+=temp;
}
lua_pushnumber(L,sum/n);
lua_pushnumber(L,sum);
lua_pushnumber(L,n);
/*标识函数有几个返回值*/
return 3;
}
然后我们来说明下这个函数的功能,计算总数并求平均数,然后将平均数,总数,和个数返回。功能非常简单,其中lua_pushnumber是将元素压入lua栈中。好了我们来看下线程函数吧:
unsigned long WINAPI threadfunc(LPVOID lpvoid)
{L1=luaL_newstate();
lua_status(L1);/* 载入Lua基本库 */
luaL_openlibs(L1);/*注册函数*/
lua_register(L1,"average",average);
luaL_dofile(L1, "test.lua");
lua_close(L1);
SetEvent(h_event);
return 0;
}
这个函数中没有什么新鲜的函数,哦罗嗦一句SetEvent(h_event);为win32api具体可以参考windows核心编程第5版。
然后我来看下主函数:
int main ( int argc, char *argv[] )
{
/* 初始化Lua */
L=luaL_newstate();
lua_status(L);/* 载入Lua基本库 */
luaL_openlibs(L);/*注册函数*/
lua_register(L,"average",average);h_event = CreateEvent(NULL,FALSE,FALSE,L"threadfunexit");
HANDLE handle = CreateThread(NULL,NULL,
threadfunc,
NULL,
NULL,NULL
);
CloseHandle(handle);
/* 运行脚本 */
luaL_dofile(L, "main.lua");
/* 清除Lua */
lua_close(L);
WaitForSingleObject(h_event,INFINITE);
CloseHandle(h_event);
/* 暂停 */system("pause");
return 0;
}
这就是主要的cpp中函数,看起来比较简单,关键是要申请两个Lua_State栈来保存这些变量。接下来我们看下两个lua文件的内容:
--test.lua
for i=1,6 do
avg,sum,n = average(10,90,30,40,51)print("test平均数是",avg)
print("test总数是",sum)
print("test个数数是",n)
endhttp://user.qzone.qq.com/362783516/infocenter#!app=2&via=QZ.HashRefresh&pos=1339417528
然后是main.lua我们来查看下这个:
for i=1,6 do
avg,sum,n = average(10,60,30,40,51)print("main平均数是",avg)
print("main总数是",sum)
print("main个数数是",n)
end
这就是如何利用lua去调用c的函数,不明白的大家可以查看下这个http://user.qzone.qq.com/362783516/infocenter#!app=2&via=QZ.HashRefresh&pos=1339417528呵呵这是我qq空间欢迎大家访问!以前的文章都写在了qq空间了,放在了vc++的分类下了。
这里一定要注意使用vs2010和lua5.2.1的环境,其他环境没有测试,要是有错误大家可以在最后留言。
给大家个截图:
最后给大家贴出全部的代码:
main.cpp
#include <stdio.h>
#include <iostream>
#include <Windows.h>
#pragma comment(lib,"lua.lib")
using namespace std;
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
lua_State* L;
lua_State* L1;
HANDLE h_event;
int average(lua_State *L)
{
int n=lua_gettop(L);
double sum=0;
for (int i=1;i<=n;i++)
{
int temp = lua_tonumber(L,i);
sum+=temp;
}
lua_pushnumber(L,sum/n);
lua_pushnumber(L,sum);
lua_pushnumber(L,n);
/*标识函数有几个返回值*/
return 3;
}
unsigned long WINAPI threadfunc(LPVOID lpvoid)
{
L1=luaL_newstate();
lua_status(L1);
/* 载入Lua基本库 */
luaL_openlibs(L1);
/*注册函数*/
lua_register(L1,"average",average);
luaL_dofile(L1, "test.lua");
lua_close(L1);
SetEvent(h_event);
return 0;
}
int main ( int argc, char *argv[] )
{
/* 初始化Lua */
L=luaL_newstate();
lua_status(L);
/* 载入Lua基本库 */
luaL_openlibs(L);
/*注册函数*/
lua_register(L,"average",average);
h_event = CreateEvent(NULL,FALSE,FALSE,L"threadfunexit");
HANDLE handle = CreateThread(NULL,NULL,
threadfunc,
NULL,
NULL,NULL
);
CloseHandle(handle);
/* 运行脚本 */
luaL_dofile(L, "main.lua");
/* 清除Lua */
lua_close(L);
WaitForSingleObject(h_event,INFINITE);
CloseHandle(h_event);
/* 暂停 */
system("pause");
return 0;
}
--test.lua
for i=1,6 do
avg,sum,n = average(10,90,30,40,51)
print("test平均数是",avg)
print("test总数是",sum)
print("test个数数是",n)
end
--main.lua
for i=1,6 do
avg,sum,n = average(10,60,30,40,51)
print("main平均数是",avg)
print("main总数是",sum)
print("main个数数是",n)
end