- 注册时间
- 2022-8-23
- 最后登录
- 2024-3-6
- 在线时间
- 2 小时
编程入门
- 天马币
- 26
|
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,"主线程")
|
|