Lua與C++的調用本文雖然有涉及但是,這不是我今天向大家推薦的內容,今天向大家寫的示例代碼是Lua如何構建控制和任務邏輯以及與主線程進行控制子線程程執行的方式。
不熟悉Windows下多線程的童鞋可以翻翻本人的多線程的相關文章,也可以自己從網上學習下多線程的編寫,以及如何合理的退出線程。這樣編寫代碼可以做到,架構靈活,業務可變更性非常強,只要實現好底層算法性代碼,業務邏輯盡量交給腳本語言吧,查錯方便,直接可以定位到具體的行數,這是C++不具備的,當然上層用Lua方便的同時,增加了編寫C++注冊到Lua的函數的人負擔,他必須非常清楚的了解Lua和C++的特性,但是對於分別編寫Lua和C++的兩撥人將非常輕松,這樣團隊只需要一個C++能人和一些中級的C++程序員,和一堆對編程了解不多的Lua程序員就可以完成復雜的業務邏輯工作。最適合團隊中只要一個技術大神的團隊或者團隊中的大神非常少的情況。這樣設計從根本上屏蔽了對C++多線程的了解,Lua程序員就可以處理多線程並發事物,他可以不知道何為原子操作,可以不知道何為關鍵段何為等待事物,這些全部交給一個去編寫完成,其他Lua程序員只需要調用即可,而不是神級的C++程序員只用來開發底層費時間的運算即可。非常適合快速開發。若後期覺得提高效率非常必要,那就將Lua寫成C++。
- #include <stdio.h>
- #include <iostream>
- #include <Windows.h>
- #include <vector>
-
-
- #pragma comment(lib,"lua.lib")
- using namespace std;
-
-
- extern "C" {
- #include "lua/lua.h"
- #include "lua/lualib.h"
- #include "lua/lauxlib.h"
- }
-
-
- lua_State* L;
- lua_State* L2;
-
-
- int average(lua_State *L)
- {
- int n=lua_gettop(L);
- double sum=0;
- for (int i=0;i<=n;i++)
- {
- sum+=lua_tonumber(L,i);
- }
- lua_pushnumber(L,sum/n);
- lua_pushnumber(L,sum);
- lua_pushnumber(L,n);
- /*標識函數有幾個返回值*/
- return 3;
- }
- HANDLE MyEvent;
- HANDLE MyExit;
- volatile unsigned long threadRun;
-
-
- struct ThreadInfo
- {
- string Text;
-
- string DataPath;
-
-
- int NextPosition;
-
-
- bool boolValue;
- };
-
-
- vector <int(*)(ThreadInfo InputThreadInfo,ThreadInfo &OutputThreadInfo)> FunctionVector;
-
-
- int AddFunction(int(*_ProcesseFunction)(ThreadInfo InputThreadInfo,ThreadInfo &OutputThreadInfo))
- {
- FunctionVector.push_back(_ProcesseFunction);
- return 0;
- }
-
-
- ThreadInfo myInputInfo;
-
-
- static unsigned long WINAPI MyThreadFunction(LPVOID lpvoid)
- {
- myInputInfo.boolValue = false;
- myInputInfo.DataPath = "kji";
- myInputInfo.NextPosition = 0;
- myInputInfo.Text = "Hello World!";
- ThreadInfo myOutPutInfo;
-
- while(1)
- {
- WaitForSingleObject(MyEvent,INFINITE);
- ResetEvent(MyEvent);
- if(0==threadRun)
- {
- break;
- }
- for (int i=0;i<(int)(FunctionVector.size());i++)
- {
- if (NULL!=(FunctionVector[i]))
- {
- (*FunctionVector[i])(myInputInfo,myOutPutInfo);
- }
- }
- }
- SetEvent(MyExit);
- return 0;
- }
-
-
- int PointFunction(ThreadInfo InputThreadInfo,ThreadInfo &OutputThreadInfo)
- {
- OutputThreadInfo.boolValue=!InputThreadInfo.boolValue;
- OutputThreadInfo.DataPath= InputThreadInfo.DataPath;
- OutputThreadInfo.NextPosition = InputThreadInfo.NextPosition+1;
- OutputThreadInfo.Text = InputThreadInfo.Text;
-
-
- printf("%s \n",OutputThreadInfo.Text);
- /* 運行腳本 */
- luaL_dofile(L2, "2.lua");
- }
-
-
- int startWork(lua_State *L)
- {
- SetEvent(MyEvent);
- return 0;
- }
-
-
- int Exit(lua_State *L)
- {
- InterlockedExchange(&threadRun,0);
- SetEvent(MyEvent);
- return 0;
- }
-
-
- int CreateMythread(LPVOID lpvoid)
- {
- MyEvent = CreateEvent(NULL,TRUE,FALSE,L"startProcess");
- MyExit = CreateEvent(NULL,TRUE,FALSE,L"ExitEvent");
- InterlockedExchange(&threadRun,1);
- DWORD dwthreadID;
- HANDLE ThreadHandle = CreateThread(NULL,NULL,MyThreadFunction,lpvoid,0,&dwthreadID);
- if (NULL==ThreadHandle)
- {
- CloseHandle(ThreadHandle);
- return 1;
- }
- CloseHandle(ThreadHandle);
- return 0;
- }
-
-
-
-
- int main ( int argc, char *argv[] )
- {
- AddFunction(PointFunction);
- CreateMythread(NULL);
-
-
- /* 初始化Lua */
- L=luaL_newstate();
- lua_status(L);
-
-
- /* 載入Lua基本庫 */
- luaL_openlibs(L);
-
-
- /*注冊函數*/
-
- L2=luaL_newstate();
- lua_status(L2);
-
-
- /* 載入Lua基本庫 */
- luaL_openlibs(L2);
-
-
- /*注冊函數*/
-
-
- lua_register(L2,"average",average);
-
-
- lua_register(L,"startWork",startWork);
-
-
- lua_register(L,"ExitAllThread",Exit);
- /* 運行腳本 */
- luaL_dofile(L, "1.lua");
-
-
-
-
-
-
- WaitForSingleObject(MyExit,INFINITE);
- ResetEvent(MyExit);
- CloseHandle(MyExit);
- CloseHandle(MyEvent);
- /* 清除Lua */
- lua_close(L);
- lua_close(L2);
- /* 暫停 */
- system("pause");
-
-
- return 0;
- }