http://support.microsoft.com/kb/190351/en-us
載點:http://code.google.com/p/damody/downloads/detail?name=luacmd.zip
使用lua腳本加 window pipe 開發
總共用了四個thread,兩個process,
我的程式三個thread,測試程式一個。
一個thread讀資料,一個thread收資料,一個thread做lua腳本的動作。
測試程式 xxx.cpp :
#include <iostream>
#include <string>
#include "windows.h"
#include <assert.h>
int main()
{
int qq12473;
//fflush(stdin);
//_CrtDbgBreak();
std::cin >> qq12473;
std::cout << qq12473+10;
//std::cin.sync();
//Sleep(200);
std::cin >> qq12473;
std::cout << qq12473+20;
}
測試的 lua腳本:
cfun.PutInteger(10);
num = cfun.GetInteger();
if (num == 20) then
print("gj")
end
cfun.PutInteger(20);
num = cfun.GetInteger();
if (num == 40) then
print("gj")
end
cfun.Pause();
主程式,大部份是在註冊lua函數:
#include <iostream>
#include <sstream>
#include <string>
#include <windows.h>
#include <tchar.h>
#include <cassert>
#include "lua/LuaCell.h"
#include "InOutCell.h"
#include <climits>
static InOutCell g_inout;
static const double NAN = LONG_MAX;
static int LuaGetNumber(lua_State* luaState)
{
double n = NAN;
for (;n == NAN;)
{
if (!g_inout.m_outstrings.empty())
{
std::stringstream ss;
ss << g_inout.m_outstrings.front();
ss >> n;
g_inout.m_outstrings.pop_front();
}
}
lua_pushnumber(luaState, n);
return 1;
}
static int LuaGetInteger(lua_State* luaState)
{
double n = NAN;
for (;n == NAN;)
{
if (!g_inout.m_outstrings.empty())
{
std::stringstream ss;
ss << g_inout.m_outstrings.front();
ss >> n;
g_inout.m_outstrings.pop_front();
}
}
lua_pushinteger(luaState, (int)n);
return 1;
}
static int LuaGetString(lua_State* luaState)
{
std::string s = g_inout.m_outstrings.front();
lua_pushstring(luaState, s.c_str());
g_inout.m_outstrings.pop_front();
return 1;
}
static int LuaPutNumber(lua_State* luaState)
{
double n = lua_tonumber(luaState, 1);
std::stringstream ss;
ss << n;
g_inout.m_instrings.push_back(ss.str());
return 1;
}
static int LuaPutInteger(lua_State* luaState)
{
int n = lua_tointeger(luaState, 1);
std::stringstream ss;
ss << n;
g_inout.m_instrings.push_back(ss.str());
return 1;
}
static int LuaPutString(lua_State* luaState)
{
std::string s = lua_tostring(luaState, 1);
g_inout.m_instrings.push_back(s);
return 1;
}
static int LuaIgnoreLine(lua_State* luaState)
{
if (!g_inout.m_outstrings.empty())
g_inout.m_outstrings.pop_front();
return 1;
}
static int LuaYield(lua_State* luaState)
{
return lua_yield(luaState, 0);
}
static int LuaPause(lua_State* luaState)
{
system("pause");
return 1;
}
static int LuaSleep(lua_State* luaState)
{
int n = lua_tointeger(luaState, 1);
Sleep(n);
return 1;
}
static const luaL_reg cmdlib[] =
{
{"GetNumber", LuaGetNumber},
{"GetInteger", LuaGetInteger},
{"GetString", LuaGetString},
{"PutNumber", LuaPutNumber},
{"PutInteger", LuaPutInteger},
{"PutString", LuaPutString},
{"Yield", LuaYield},
{"IgnoreLine", LuaIgnoreLine},
{"Sleep", LuaSleep},
{"Pause", LuaPause},
{NULL, NULL},
};
int _tmain(int argc, _TCHAR* argv[])
{
g_inout.RegisterFunction("cfun", cmdlib);
g_inout.InputLuaFile("rule.lua");
for (int i=0;i<argc;i++)
std::wcout << argv[i] << std::endl;
if (argc == 2)
g_inout.Work((wchar_t*)argv[1]);
return 0;
}
留言列表