首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

多线程中的信号槽和dbus延时有关问题?

2012-12-20 
多线程中的信号槽和dbus延时问题??大家好,现在工作中遇到一个问题,希望有人帮忙解答下,谢谢!程序使用多线

多线程中的信号槽和dbus延时问题??
大家好,现在工作中遇到一个问题,希望有人帮忙解答下,谢谢!

程序使用多线程,子线程加载数据,主线程显示UI,加载的过程中,主线程显示缓冲页面。

当加载完成时,子线程需要通知主线程,然后主线程结束缓冲图形,并显示文件内容。

这个通知的方法,之前用的是信号槽,但是不知道是不是连接同步还是异步的问题,要么缓冲界面卡在那(没有缓冲动画),然

后卡个几秒直接显示数据,若将显示文件内容的代码注释掉,缓冲界面就显示正常了。

现在改为用dbus消息的发送和接收,按说能避开同步还是异步的问题,但还存在这个现象,请问大家有什么好的方法没?
[最优解释]
lz是的程序运行在什么环境下?PC还是嵌入式?
[其他解释]

引用:
lz是的程序运行在什么环境下?PC还是嵌入式?


嵌入式,x86平台(meego)上运行,在ubuntu上开发。
[其他解释]
引用:
lz是的程序运行在什么环境下?PC还是嵌入式?


就是基于Qt 做了一个pdf 阅读器,加载pdf的过程很耗时,需要有缓冲界面,这个加载就放在子线程中,缓冲界面就在主线程显示,头疼之处在于子线程加载完成了该用什么方式通知主线程,之前用了信号槽,发现不行。
[其他解释]
这个用信号和槽是完全可以实现的呀

怎么不行了?有什么提示?

另外,你的UI是QML还是C++?
[其他解释]
引用:
这个用信号和槽是完全可以实现的呀

怎么不行了?有什么提示?

另外,你的UI是QML还是C++?


UI 是C++

我之前以为信号槽是可以的,但是试了之后没有预期的效果,子线程发的信号到主线程去接收,用哪种方式(自动 ?直连 ?排队 ?),缓冲界面的效果是一排暗点,一个亮点在每个暗点上依次亮(Qt 定时器),出来的结果是,亮点没有,只有暗点,卡个几秒文件显示出来了。
[其他解释]
应该还是代码有问题。信号和槽的连接方式应该使用自动或是排队,不能使用直连。

先确认在PC上可以正确执行吗?或者先不要折腾你的程序,新建一个工程,单独对这部分内容进行验证,先在PC上试验,然后在上设备。
[其他解释]
恩,包括所有的可能性都试过,但都出现下面奇怪的现象。

1、如果加载完了不显示文件内容,那么缓冲毫无问题。
2、如果显示文件内容,那么缓冲就只有暗点,亮点根本不亮,卡个几秒(这几秒加载文件)后显示文件,缓冲是亮暗点是用定时器做的。


[其他解释]
引用:
应该还是代码有问题。信号和槽的连接方式应该使用自动或是排队,不能使用直连。

先确认在PC上可以正确执行吗?或者先不要折腾你的程序,新建一个工程,单独对这部分内容进行验证,先在PC上试验,然后在上设备。


PC上就执行不了。如果单独验证,耗时的这部分我还没想到用什么来模拟。

整个逻辑是这样,点击文件--->显示缓冲---->子线程加载数据---->结束缓冲---->显示数据内容,逻辑有无问题??
[其他解释]
你的子线程是在数据加载完成后向主线程发射信号的吗?你有没有debug一下信号是否已经收到?看你的描述,如果不显示文件内容,那么缓冲毫无问题,这基本可以断定,子线程和主线程间的信号和槽连接正常。

那现在问题一定是出在显示文件内容的部分了,但,不管怎样,它和线程间的信号传递已经没关系了。因为根据你的逻辑顺序,结束缓冲---->显示数据内容,也就是说,当你显示内容时,缓冲界面应该消失了才对。


[其他解释]
信号之间的传递,接收都没有问题,槽函数都可以正常执行。

头疼之处在于,如果把显示文件的代码加上,那么缓冲就只有暗的点,亮的点没有(正常应该是亮的点循环动),

那一般来说是缓冲的这个类出的问题,但是如果不显示加载后的文件,缓冲一切正常(亮的点跳的很欢快),这

才是让我纠结的地方。

Ps:不管问题最后有没有解决,都要向你说声“谢谢”....
[其他解释]
跟踪一下代码,看看显示缓冲界面时都做了些什么。按你的描述,显示文件的代码应该是在缓冲界面消失之后执行的,但是,现在它很可能是提前了,所以造成缓冲界面特别慢。是这样的现象吗?
[其他解释]
引用:
跟踪一下代码,看看显示缓冲界面时都做了些什么。按你的描述,显示文件的代码应该是在缓冲界面消失之后执行的,但是,现在它很可能是提前了,所以造成缓冲界面特别慢。是这样的现象吗?


描述一下我的缓冲界面,一排五个暗的点,然后一个亮的点从第一个亮到第五个,就像有的手机程序(比如安全管家)清理垃圾数据时出来的动画一下。

然后我的问题是,缓冲动画会出来,但是只有一排五个暗的点,亮的点不出来(这个循环亮是用定时器做的),然后停顿3秒左右,文件内容就出来了。

我以为是缓冲的那个类出的问题,但注释掉显示文件内容的那段代码后,缓冲就正常了(亮的点循环亮),我的困惑正是这个。
[其他解释]
帮你顶顶吧……
------其他解决方案--------------------


该回复于2012-10-17 13:44:27被版主删除
[其他解释]
自己再顶顶
[其他解释]
哈。 通过你这个描述应该是没用使用成功多线程哈。。
也就是说你的读数据的时候也是用的Gui线程哈。

有2个方法可以验证
1 如果你读取数据的方法是个while 或者for 循环在入口位置,
       QApplication::processEvent(); 动画就能放了。
2 qDebug() << QThread::currentThread() 分别打印出你Gui线程的ID和 你子线程的ID。


[其他解释]

引用:
哈。 通过你这个描述应该是没用使用成功多线程哈。。
也就是说你的读数据的时候也是用的Gui线程哈。

有2个方法可以验证
1 如果你读取数据的方法是个while 或者for 循环在入口位置,
       QApplication::processEvent(); 动画就能放了。
2 qDebug() << QThread::currentThread() 分别打印出你Gui线程的I……


1、我可以很负责任的说,多线程使用成功了,主线程和子线程id是不同的!
2、如果我读数据的方法不是while或者for循环呢?
3、打印子线程id的方法试过了,不行!
[其他解释]
没这么诡异的哈。排错不能急~~
[其他解释]
哈。帖代码哈。
[其他解释]
引用:
没这么诡异的哈。排错不能急~~


急倒是不急,上次看到一哥们找错找了三个月,发现是if语句写反了.....

就是有点头疼,我现在只是用extern 对象来解决,头疼,疼....

热点排行