• 4600阅读
  • 2回复

[提问]QT中使用Lua的问题 [复制链接]

上一主题 下一主题
离线yongzhy
 

只看楼主 倒序阅读 楼主  发表于: 2011-10-20
项目要做一个测试工具,通过并口生成波形,波形的精度要求到ms级别。因为生成的波形没有格式,所以我用内嵌lua来加载不同的文件生成不同的波形。下图是成品



这个版本已经可以成功生成波形,精度也满足要求(用的是Linux下面的nanosleep),不过在显示现在写入的数据问题。pwrite,msleep, print是c++实现的函数,三个个函数都是全局函数,msleep是用nanosleep实现的ms级别的等待。GUI是一个进程,用20ms的QTimer来更新界面上并口数据(还没有想到怎么用signal来根据数据变化来更新),当执行lua的时候,启用另外一个QThread,这个Thread用luaL_dofile来执行lua文件。当lua执行msleep的时候,好像是GUI的thread被停了,所以GUI没有20ms更新,直到msleep完,GUI才更新。这样,显示在界面上的并口数据就是错的了。想问高手:1. 怎样实现一个sleep只停lua的那个thread,而不是GUI的thread?2. 有什么好办法来让lua运行pwrite的时候就给GUI一个signal去更新GUI?
离线dbzhang800

只看该作者 1楼 发表于: 2011-10-20
只有你调用sleep的那个线程才会sleep,其他线程不会受影响。

题外:
看你的描述,最大的可能就是你不熟悉QThread的用法,错误地在主线程中调用了sleep
离线yongzhy

只看该作者 2楼 发表于: 2011-10-20
相关代码:LuaRunner是一个QThread,在用户点【start】按钮的时候run,L_MSleep()不是LuaRunner的method。

  1. LuaRunner::LuaRunner(QObject *parent) :
  2.     QThread(parent)
  3. {
  4.     runlua = false;
  5. }
  6. void LuaRunner::run()
  7. {
  8.     QString err = "";
  9.     runlua = true;
  10.     LUA_RunScript(this->ff, err);
  11.     runlua = false;
  12.     if(err != "")
  13.     {
  14.         emit errorMessage(err);
  15.     }
  16. }
  17. int LuaRunner::LUA_RunScript(QString ff, QString &err)
  18. {
  19.     L = lua_open();
  20.     luaL_openlibs(L);
  21.     if (luaL_loadfile(L, ff.toAscii()) || lua_pcall(L, 0, 0, 0))
  22.     {
  23.         err = QString(lua_tostring(L, -1));
  24.         return -1;
  25.     }
  26.     lua_register(L, "ssleep", L_SSleep);
  27.     lua_register(L, "msleep", L_MSleep);
  28.     lua_register(L, "pwrite", L_PortWrite);
  29.     lua_register(L, "print", L_Log);
  30.     lua_getglobal(L, "dotest");
  31.     if (!lua_isfunction(L, -1))
  32.     {
  33.         err = QString("Test function(dotest) should be a function");
  34.         return -1;
  35.     }
  36.     if(lua_pcall(L, 0, 0, 0))
  37.     {
  38.         err = QString(lua_tostring(L, -1));
  39.         return -1;
  40.     }
  41.     lua_close(L);
  42.     return 0;
  43. }
  44. int L_MSleep(lua_State* l)
  45. {
  46.     int milisec=0;
  47.     struct timespec req={0, 0};
  48.     time_t sec;
  49.     milisec=luaL_optint(l,1,0); // obtain parameter
  50.     if (milisec==0)
  51.        return 0;
  52.     sec=(int)(milisec/1000);
  53.     milisec=milisec-(sec*1000);
  54.     req.tv_sec=sec;
  55.     req.tv_nsec=milisec*1000000L;
  56.     while(nanosleep(&req,&req)==-1)
  57.          continue;
  58.     return 1;
  59. }


快速回复
限100 字节
 
上一个 下一个