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