lua与c++的调用本文虽然有涉及但是,这不是我今天向大家推荐的内容,今天向大家写的示例代码是lua如何构建控制和任务逻辑以及与主线程进行控制子线程程执行的方式。
不熟悉windows下多线程的童鞋可以翻翻本人的多线程的相关文章,也可以自己从网上学习下多线程的编写,以及如何合理的退出线程。这样编写代码可以做到,架构灵活,业务可变更性非常强,只要实现好底层算法性代码,业务逻辑尽量交给脚本语言吧,查错方便,直接可以定位到具体的行数,这是c++不具备的,当然上层用lua方便的同时,增加了编写c++注册到lua的函数的人负担,他必须非常清楚的了解lua和c++的特性,但是对于分别编写lua和c++的两拨人将非常轻松,这样团队只需要一个c++能人和一些中级的c++程序员,和一堆对编程了解不多的lua程序员就可以完成复杂的业务逻辑工作。最适合团队中只要一个技术大神的团队或者团队中的大神非常少的情况。这样设计从根本上屏蔽了对c++多线程的了解,lua程序员就可以处理多线程并发事物,他可以不知道何为原子操作,可以不知道何为关键段何为等待事物,这些全部交给一个去编写完成,其他lua程序员只需要调用即可,而不是神级的c++程序员只用来开发底层费时间的运算即可。非常适合快速开发。若后期觉得提高效率非常必要,那就将lua写成c++。
#include <stdio.h>
#include <iostream>
#include <Windows.h>
#include <vector>
#pragma comment(lib,"lua.lib")
using namespace std;
extern "C" {
#include "lua/lua.h"
#include "lua/lualib.h"
#include "lua/lauxlib.h"
}
lua_State* L;
lua_State* L2;
int average(lua_State *L)
{
int n=lua_gettop(L);
double sum=0;
for (int i=0;i<=n;i++)
{
sum+=lua_tonumber(L,i);
}
lua_pushnumber(L,sum/n);
lua_pushnumber(L,sum);
lua_pushnumber(L,n);
/*标识函数有几个返回值*/
return 3;
}
HANDLE MyEvent;
HANDLE MyExit;
volatile unsigned long threadRun;
struct ThreadInfo
{
string Text;
string DataPath;
int NextPosition;
bool boolValue;
};
vector <int(*)(ThreadInfo InputThreadInfo,ThreadInfo &OutputThreadInfo)> FunctionVector;
int AddFunction(int(*_ProcesseFunction)(ThreadInfo InputThreadInfo,ThreadInfo &OutputThreadInfo))
{
FunctionVector.push_back(_ProcesseFunction);
return 0;
}
ThreadInfo myInputInfo;
static unsigned long WINAPI MyThreadFunction(LPVOID lpvoid)
{
myInputInfo.boolValue = false;
myInputInfo.DataPath = "kji";
myInputInfo.NextPosition = 0;
myInputInfo.Text = "Hello World!";
ThreadInfo myOutPutInfo;
while(1)
{
WaitForSingleObject(MyEvent,INFINITE);
ResetEvent(MyEvent);
if(0==threadRun)
{
break;
}
for (int i=0;i<(int)(FunctionVector.size());i++)
{
if (NULL!=(FunctionVector[i]))
{
(*FunctionVector[i])(myInputInfo,myOutPutInfo);
}
}
}
SetEvent(MyExit);
return 0;
}
int PointFunction(ThreadInfo InputThreadInfo,ThreadInfo &OutputThreadInfo)
{
OutputThreadInfo.boolValue=!InputThreadInfo.boolValue;
OutputThreadInfo.DataPath= InputThreadInfo.DataPath;
OutputThreadInfo.NextPosition = InputThreadInfo.NextPosition+1;
OutputThreadInfo.Text = InputThreadInfo.Text;
printf("%s \n",OutputThreadInfo.Text);
/* 运行脚本 */
luaL_dofile(L2, "2.lua");
}
int startWork(lua_State *L)
{
SetEvent(MyEvent);
return 0;
}
int Exit(lua_State *L)
{
InterlockedExchange(&threadRun,0);
SetEvent(MyEvent);
return 0;
}
int CreateMythread(LPVOID lpvoid)
{
MyEvent = CreateEvent(NULL,TRUE,FALSE,L"startProcess");
MyExit = CreateEvent(NULL,TRUE,FALSE,L"ExitEvent");
InterlockedExchange(&threadRun,1);
DWORD dwthreadID;
HANDLE ThreadHandle = CreateThread(NULL,NULL,MyThreadFunction,lpvoid,0,&dwthreadID);
if (NULL==ThreadHandle)
{
CloseHandle(ThreadHandle);
return 1;
}
CloseHandle(ThreadHandle);
return 0;
}
int main ( int argc, char *argv[] )
{
AddFunction(PointFunction);
CreateMythread(NULL);
/* 初始化Lua */
L=luaL_newstate();
lua_status(L);
/* 载入Lua基本库 */
luaL_openlibs(L);
/*注册函数*/
L2=luaL_newstate();
lua_status(L2);
/* 载入Lua基本库 */
luaL_openlibs(L2);
/*注册函数*/
lua_register(L2,"average",average);
lua_register(L,"startWork",startWork);
lua_register(L,"ExitAllThread",Exit);
/* 运行脚本 */
luaL_dofile(L, "1.lua");
WaitForSingleObject(MyExit,INFINITE);
ResetEvent(MyExit);
CloseHandle(MyExit);
CloseHandle(MyEvent);
/* 清除Lua */
lua_close(L);
lua_close(L2);
/* 暂停 */
system("pause");
return 0;
}
这里是大家熟悉的1.lua,用来处理任务开始和退出的控制。1是开始任务,其他则退出。脚本2.lua为任务处理的脚本,当然这里只是一个求均值的脚本。
function input()
local a = io.read("*number");
return a;
end
function main()
while true do
local a=input();
if 1==a then
startWork();
else
break;
end
end
ExitAllThread();
end
main()
这里是大家熟悉的2.lua任务处理线程,这个只是一个简单的示例,用来帮助大家实现简单的一个主线程控制多个子线程完成具体任务的代码,这只是个示例,具体作用,只针对真正用过lua的人自己体会吧,这里就不多说了。没用过的人不要总问为什么我要用lua,lua给我带来了什么好处,lua给你带来了所有动态语言的好处,同时它是所有动态语言中效率最高的。不要强调c++更适合业务逻辑处理,用了lua写点东西然后再说哪种适合复杂的业务逻辑处理,我也很喜欢c++,但是c++该做的是处理高速运算的东西,或者高速刷新界面的东西,lua则负责处理键盘输入消息,或者按钮输入消息,以及如何将各种运算组合成业务逻辑,中间层由lua完成,上层由各个平台自己的UI完成,底层由c++高效完成,这样可以实现高效处理和上层灵活性以及高效完成代码编写,不必强调c++能完成为什么要用lua,这个东西和汇编能完成我为什么要用c++一样,我不想回答,你觉得c++好用我不反对,至于你要不要用lua自己看着办。别问这些,这些需要自己体会。
function test()
avg,sum,n = average(10,20,30,40,51)
print("平均数是",avg)
print("总数是",sum)
print("个数数是",n)
end
test();