新浪微博
腾讯微博
会员列表
统计排行
基本信息
到访IP统计
管理团队
管理统计
在线会员
会员排行
版块排行
帖子排行
标签排行
帮助
下拉
用户名
电子邮箱
用户名
密 码
记住登录
登录
找回密码
注册
快捷通道
关闭
您还没有登录,快捷通道只有在登录后才能使用。
立即登录
还没有帐号? 赶紧
注册一个
首页
论坛
Qt下载
作品展
群组
个人中心
捐赠、管理与开发
邮件订阅
帖子
文章
日志
用户
版块
群组
帖子
搜索
QTCN开发网
>
Qt基础编程
>
QT中使用Lua的问题
发帖
回复
返回列表
新帖
4600
阅读
2
回复
[提问]
QT中使用Lua的问题
[复制链接]
上一主题
下一主题
离线
yongzhy
UID:123402
注册时间
2011-10-20
最后登录
2017-09-14
在线时间
2小时
发帖
2
搜Ta的帖子
精华
0
金钱
20
威望
12
贡献值
0
好评度
2
访问TA的空间
加好友
用道具
新手上路
关闭
个人中心可以申请新版勋章哦
立即申请
知道了
加关注
发消息
只看楼主
倒序阅读
楼主
发表于: 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?
共
条评分
回复
举报
分享到
淘江湖
新浪
QQ微博
QQ空间
开心
人人
豆瓣
网易微博
百度
鲜果
白社会
飞信
离线
dbzhang800
UID:7394
注册时间
2006-06-03
最后登录
2024-05-29
在线时间
9894小时
发帖
5580
搜Ta的帖子
精华
2
金钱
56167
威望
5627
贡献值
20
好评度
5629
访问TA的空间
加好友
用道具
论坛版主
加关注
发消息
只看该作者
1楼
发表于: 2011-10-20
只有你调用sleep的那个线程才会sleep,其他线程不会受影响。
题外:
看你的描述,最大的可能就是你不熟悉QThread的用法,错误地在主线程中调用了sleep
共
条评分
回复
举报
离线
yongzhy
UID:123402
注册时间
2011-10-20
最后登录
2017-09-14
在线时间
2小时
发帖
2
搜Ta的帖子
精华
0
金钱
20
威望
12
贡献值
0
好评度
2
访问TA的空间
加好友
用道具
新手上路
加关注
发消息
只看该作者
2楼
发表于: 2011-10-20
相关代码:LuaRunner是一个QThread,在用户点【start】按钮的时候run,L_MSleep()不是LuaRunner的method。
复制代码
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;
}
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;
}
共
条评分
回复
举报
发帖
回复
返回列表
http://www.qtcn.org/bbs
访问内容超出本站范围,不能确定是否安全
继续访问
取消访问
快速回复
限100 字节
您目前还是游客,请
登录
或
注册
进入高级模式
文字颜色
发 布
回复后跳转到最后一页
上一个
下一个
关闭
补充发布信息
验证码:
发 布
隐藏
快速跳转
站务及资讯
网站公告
新闻资讯
Qt官方发布
网站管理
Qt应用及资源
Qt 作品展
Qt代码秀
Qt应用版
Qt技术讨论区
Qt安装与发布
Qt中文处理
Qt基础编程
Qt QML开发
Qt嵌入式开发
Qt移动平台开发
其它技术开发讨论区
Qt图书专区
《C++ GUI Qt 4编程》(第2版)专栏
《Qt高级编程》专栏
《零基础学Qt4编程》专栏
《Qt设计模式》(第2版) 图书专栏
Python Qt GUI快速编程
Qt项目开发区
天池项目
Qt开放平台开发库
机械CAD
扇贝词典
非活跃项目区
社区中心
帖子回收站(Trash)
招聘、求职、供求、广告等
休闲娱乐
关闭
关闭
选中
1
篇
全选