- 注册时间
- 2021-4-16
- 最后登录
- 2023-10-19
- 在线时间
- 2 小时
编程入门
- 龙马币
- 114
|
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,"主线程")
复制代码
|
|