首页
社区
课程
招聘
[原创]lua模拟windows线程
发表于: 2015-6-24 23:20 6052

[原创]lua模拟windows线程

2015-6-24 23:20
6052

前言:
   来看雪也好几年了,一直没什么贡献,放点技术含量不高,但是很实用的东东.其实这个我说是原创可能有点不妥,但是没发现过比较完整的文章.所以如果有重复大家请别见怪.
本代码我估计肯有人想到过 甚至已经写出来了,但是对于高手来说这个很简单,所以觉得没必要贴出来
我就本着共享精神 献丑一下了.大神勿怪

lua 是个好东西,我本身比较喜欢 [研究] 游戏辅助, 感觉 C++ 和 lua 干这个真的是绝配.
你是否有想过 加血 创建个计时器,打怪 创建个线程 这样简单粗暴的解决方法呢.
但是lua不支持多线程,那怎么办呢? 呵呵 这就是今天的主题了

废话不多说看重点
lua 不支持多线程 但是支持协程, 那么我们就用协程来模拟出多线程
因为是模拟的多线程,所以跟真正的多线程还是有区别的,
比如在模拟的多线程里不能无限制的一直运行指令
必须在适当的时候调用 LuaApi.sleep 延时一下,不然 别的线程就执行不了了
当然对于lua而言我想正常的需求肯定都会有 sleep 的参与,所以影响应该不大.

好了看介绍

功能介绍:
类似 windows 的线程 操作
特性  线程退出  那么它创建的子线程  和计时器 也会一起退出   这个自己看源码改为自己需要的
其他都是一些熟悉的API 相信大家都能看懂   同时也有一些注视

使用方式
C++ 部分

lua_State * L = NULL;
BOOL  g_bLuaThread = FALSE;

int lua_GetTickCount(lua_State * L)
{
        lua_pushinteger(L,GetTickCount());
        return 1;
}

DWORD WINAPI ThreadPoc(LPVOID lpPara)
{
        while(g_bLuaThread){
                luaL_dostring(L,"LuaApi:Run()")
                Sleep(1);
        }
        return 0;
}
void dllmain()
{
        L = luaL_newstate();
        luaL_openlibs(L);
        //这里  注意   上面部分已经初始化好了 Lua虚拟机
       
        //这里同时要执行一下 SYSTEM.lua  也就是本文件
        luaL_dofile(L,"C:\\SYSTEM.lua");//这里假设我的文件是放在C盘的
       
        //然后还需要注意
        //这个虚拟系统有一个依赖的函数  GetTickCount  需要提前注册
        luaL_register(L,"GetTickCount",lua_GetTickCount)
       
        //以上就初始化完毕了虚拟系统了
        //然后  和 exe文件差不多   在运行虚拟系统以前  得指定一个主函数
        //一般我是把这个主函数放在lua文件里了
        luaL_dofile(L,"C:\\TestLua.lua");
       
        g_bLuaThread = TRUE;
        CloseHandle(CreateThread(NULL,NULL,ThreadPoc,NULL,NULL,NULL));
       
}

lua 部分
假设文件  为 C:\\TestLua.lua
内容如下:

--测试函数1
function TestThread1()
        local f = io.open("c:\\线程1创建的文件.txt","w")
        f:close()
end

--测试函数2  测试参数
function TestThread2(TestPara)
        local f = io.open("c:\\"..TestPara..".txt","w")
        f:close()
end

--测试函数3  测试异常
function TestThread3()
        local a
        table.insert(a,1)
       
end

function SysMainEnter()
        print("进入主函数")
        local Thread1 = LuaApi:CreateThread(TestThread1,nil,"TestThread1")
        local Thread2 = LuaApi:CreateThread(TestThread2,"测试参数","测试参数线程")
        local Thread3 = LuaApi:CreateThread(TestThread3,"测试异常","测试异常线程")
       
       
        --- 主线程不能退出  因为  退出的话 会强制退出掉 他创建的子线程
        --一般可以用这条线程  接收一些 控制台传过来的参数什么的
        while true do  
                LuaApi.sleep(10000)
        end
end
LuaApi:CreateThread(SysMainEnter,nil,"主线程")

另外想请教一下 辅助的逻辑  打*怪  加*血  放*技能 做*任务/副本
怎么才能做到 高效 智能 易扩展
因为我这些东西都是自学 未接受过 正规的编程教育,基础比较差,所以希望大家多多指教
qq:499908787
同时如果对代码有什么不明白的也可以联系我


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 3
支持
分享
最新回复 (4)
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
原来是这样的啊
2015-6-24 23:33
0
雪    币: 517
活跃值: (84)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
3
一个lua_State被多线程使用是不安全的。你可以选择加上临界区/互斥体,或为每个线程提供各自的lua_State
2015-6-25 10:25
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
给你2个lua多线程实现,开源的。
上传的附件:
2015-6-25 10:53
0
雪    币: 25
活跃值: (39)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
我这个是用单线程,然后多协成.用协成来模拟出的线程
2015-6-25 15:27
0
游客
登录 | 注册 方可回帖
返回
//