• 11620阅读
  • 16回复

如何改进signal/slot机制的速度? [复制链接]

上一主题 下一主题
离线tumblm
 
只看楼主 倒序阅读 楼主  发表于: 2008-10-27
— 本帖被 XChinux 执行加亮操作(2008-11-02) —
看到有人说,signal/slot机制响应时间是110ms,怎么这么慢阿

我想要达到10ms以上的实时相应,怎么办啊?
离线htyoung

只看该作者 1楼 发表于: 2008-10-27
110ms 是我自己在windows下测试的,并不是官方标准。
只作参考。
***
QT5
***
离线tumblm
只看该作者 2楼 发表于: 2008-10-27
引用第1楼htyoung于2008-10-27 22:39发表的  :
110ms 是我自己在windows下测试的,并不是官方标准。
只作参考。

hi,
我现在确实遇到了这个问题,在子线程中读取数据,然后用signal-slot通知主线程绘制。
我觉得画的速度跟不上子线程读取数据的速度。
你有什么好的解决办法么?谢谢!
离线htyoung

只看该作者 3楼 发表于: 2008-10-27
signal/slot现在为止没有好的方法去提高运行效率,这也是为什么QT一直被人说的原因,
据说QT4.5有很大的提高,不知道是不是在这上。
QT4比QT3好很多了,既希望于QT5。

还有,如果你的时间响应要求很高就不要用signal/slot。
***
QT5
***
离线htyoung

只看该作者 4楼 发表于: 2008-10-27
引用第2楼tumblm于2008-10-27 23:05发表的  :
hi,
我现在确实遇到了这个问题,在子线程中读取数据,然后用signal-slot通知主线程绘制。
我觉得画的速度跟不上子线程读取数据的速度。
你有什么好的解决办法么?谢谢!


我一般用FIFO的模式在两个线程间作缓存,
如果是QT可以试一下QQueue作FIFO,同时要注意用QMutex来保护
***
QT5
***
离线tumblm
只看该作者 5楼 发表于: 2008-10-28
谢啦,但是不用signal-slot,用什么方法可以代替呢?
我还是很想要一个类似于slot的可以发送message的东西的
离线aaaxjb

只看该作者 6楼 发表于: 2008-10-28
110 毫秒 也太慢了吧  怎么测试的贴出来啊
离线water_wf

只看该作者 7楼 发表于: 2008-10-28
可以通过callback开处理消息,设计一个通用消息传递类,通过访问者来进行注册
离线yj_yulin

只看该作者 8楼 发表于: 2008-10-28
跨线程的处理,估计速度不会太好,因为涉及到线程的同步。
另外就是因为signal和slot是同步的,所以slot里面处理花的时间也会让整个调用要长时间才能返回。
一般的处理试试postevent,最有效的应该是需要长时间的处理过程放到单独的线程,只是把简单的结果通知gui就行。只是这样编码可能会比较麻烦,需要注意的东西也要多一些,对人员的要求可能高一些。

这里是搜索到boost::singal的一个性能讨论,有些老了。
http://lists.boost.org/Archives/boost/2005/12/98328.php

里面的一个测试结果是这样的:
Results:
    function pointer 0.1 sec
    Boost::function: 0.31 sec
    Boost::signals 9.5 sec
    Qt 1.3 sec
离线priestmoon

只看该作者 9楼 发表于: 2008-10-28
记得qt example里面有个电子钟程序。在它的基础上改写成了一个倒数计时器。
普通的实现方法:一个secTimer每隔1s发送一个signal,对应的slot负责把计数-1刷新。
还有一个singleshot的globalTimer直到时间全部走完发一个signal,让前面的timer停止工作。
预定时间是10s的话,就设置globalTimer->start(10*1000);
程序运行后能正常倒计时输出。但最终会停在0:01静止。
最后一个secTimer的signal没有被发出。
在同一时刻,不同的signal之间发送的先后次序是不确定的。
那么推想原因,可能是在整10s的同一时刻下,globalTimer率先发送信号让secTimer停掉,
使得secTimer来不及发最后一个signal。但是如果让globalTimer->start(10*1000+5),
故意让globalTimer延迟的话,在本人的1.7GHz, 512M机器上仍然是停在0:01。
这似乎提示了某种延迟的存在(且延迟>=5ms)。
后来通过试行错误逐渐延长globalTimer的时间,终于在+50ms得到了0:00。
离线tumblm
只看该作者 10楼 发表于: 2008-10-28
引用第8楼yj_yulin于2008-10-28 10:57发表的  :
跨线程的处理,估计速度不会太好,因为涉及到线程的同步。
另外就是因为signal和slot是同步的,所以slot里面处理花的时间也会让整个调用要长时间才能返回。
一般的处理试试postevent,最有效的应该是需要长时间的处理过程放到单独的线程,只是把简单的结果通知gui就行。只是这样编码可能会比较麻烦,需要注意的东西也要多一些,对人员的要求可能高一些。
这里是搜索到boost::singal的一个性能讨论,有些老了。
.......

postevent是哪个类的函数?
离线sbtree
只看该作者 11楼 发表于: 2008-10-29
引用第10楼tumblm于2008-10-28 18:45发表的  :
postevent是哪个类的函数?

QCoreApplication
windows 7 + VC++2008 + Qt4.5.2
离线vrcats
只看该作者 12楼 发表于: 2008-11-04
Qt不太适合用来开发实时应用。如果要求快就应该做类间的直接调用,不管是当作公有函数还是友元,signal/slot要查表,要排队,速度肯定不会快
离线priestmoon

只看该作者 13楼 发表于: 2008-11-04
引用第12楼vrcats于2008-11-04 20:59发表的  :
Qt不太适合用来开发实时应用。如果要求快就应该做类间的直接调用,不管是当作公有函数还是友元,signal/slot要查表,要排队,速度肯定不会快


如果按个button就要出反应的程序,怎么做类间的直接调用?
没有消息传递怕是不行吧。。。。。。。。
离线vrcats
只看该作者 14楼 发表于: 2008-11-04
我觉着应该也可以,就相当于放着Qt不用用纯C++了
离线htyoung

只看该作者 15楼 发表于: 2008-11-04
我们开发的时候,只要把界面(QT)和应用(C/C++)分开就行,
QT也说过,它是一个GUI的框架,不可能是万能的。
同时我们也不用怀疑QT 的性能,看看KDE,我们的项目应该不会比KDE复杂的。
***
QT5
***
离线sbtree
只看该作者 16楼 发表于: 2008-11-05
引用第13楼priestmoon于2008-11-04 21:20发表的  :
如果按个button就要出反应的程序,怎么做类间的直接调用?
没有消息传递怕是不行吧。。。。。。。。


传递指针
windows 7 + VC++2008 + Qt4.5.2
快速回复
限100 字节
 
上一个 下一个