Lua抢占式多线程的编写(windows7系统)

7 篇文章 0 订阅
6 篇文章 0 订阅

写了那么久的单线程程序大家一定认为Lua只能实现简单的单线程的程序,当然如果你只用lua的话只能是单线程运行,然而如果你要用多线程,就需要找一个运行平台来做,windows或者linux都可以,这里我选择windows,Lua版本为5.2.1版本。

                   如果不太了解windows下多线程的可以先看下createthread这个函数的用法,然后结合我的http://blog.csdn.net/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




 

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值