Jacqueline季 发表于 2024-3-5 09:16:29

lua模拟windows线程附源码

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



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

好了看介绍

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


使用方式
C++ 部分

lua_State * L = NULL;
BOOLg_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,"主线程")


页: [1]
查看完整版本: lua模拟windows线程附源码