来自Lua脚本的nanosleep()调用已暂停QT GUI线程。

我正在开发一个测试工具,用于从PC并行端口生成波形。该工具旨在生成任何模式的波形,并具有毫秒级的精确度,因此我使用Lua脚本定义波形模式,当用户单击[Start]按钮时,GUI开始新的QThread来运行脚本。

以下三个Lua函数被实现为全局C++函数:

  • pwrite:将数据写入并行端口。
  • msleep:等待一定毫秒数(使用nanosleep()实现)
  • print:覆盖Lua默认打印函数,这个函数将消息附加到一个QTextEdit小部件上。

当pwrite被调用时,写入的数据存储在全局变量中,然后以20毫秒间隔更新GUI,以更新GUI上的并行端口数据。(这个20毫秒间隔刷新不是一个好的设计,但我还没有想出如何使用信号使GUI在数据改变时更新)。

现在该工具基本上是功能性的。波形输出没有问题,但并行端口数据更新有一些问题:

当Lua调用msleep时,GUI线程停止,仅在msleep结束后并行端口数据更新。

因此,我的问题是:

  1. 如何实现睡眠方法,使其不会阻止GUI线程更新?

  2. 如何实现pwrite,以便GUI可以接收一个信号,在写入的数据变化时更新并行端口数据?

程序GUI链接如下: ![程序GUI](https://i.stack.imgur.com/YlI8z.png)

相关代码:

    /* common.cpp file */

int L_MSleep(lua_State* l)
{
    int milisec=0;
    struct timespec req={0, 0};
    time_t sec;

    milisec=luaL_optint(l,1,0); // obtain parameter

    if (milisec==0)
       return 0;

    sec=(int)(milisec/1000);

    milisec=milisec-(sec*1000);
    req.tv_sec=sec;
    req.tv_nsec=milisec*1000000L;

    while(nanosleep(&req,&req)==-1)
         continue;

    return 1;
}

/* LuaRunner.cpp file */
LuaRunner::LuaRunner(QObject *parent) :
    QThread(parent)
{
    runlua = false;
}

void LuaRunner::run()
{
    QString err = "";

    runlua = true;
    LUA_RunScript(this->ff, err);
    runlua = false;

    if(err != "")
    {
        emit errorMessage(err);
    }
}

int LuaRunner::LUA_RunScript(QString ff, QString &err)
{
    L = lua_open();
    luaL_openlibs(L);

    if (luaL_loadfile(L, ff.toAscii()) || lua_pcall(L, 0, 0, 0))
    {
        err = QString(lua_tostring(L, -1));
        return -1;
    }

    lua_register(L, "ssleep", L_SSleep);
    lua_register(L, "msleep", L_MSleep);
    lua_register(L, "pwrite", L_PortWrite);
    lua_register(L, "print", L_Log);

    lua_getglobal(L, "dotest");
    if (!lua_isfunction(L, -1))
    {
        err = QString("Test function(dotest) should be a function");
        return -1;
    }

    if(lua_pcall(L, 0, 0, 0))
    {
        err = QString(lua_tostring(L, -1));
        return -1;
    }

    lua_close(L);

    return 0;
}

原文链接 https://stackoverflow.com/questions/7818655

点赞
stackoverflow用户33252
stackoverflow用户33252

也许你应该使用QT的 msleep,因为它是由QThread提供的。

2011-10-20 20:43:45