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;
}




讓地獄深紅的天亮 發表在 痞客邦 PIXNET 留言(0) 人氣()