我正在写一个程序,它应该在QWidget
中显示QLabel
中的图像。图像从服务器发送。首先,我有一个负责连接和从服务器接收数据的线程。当收到数据时,套接字线程将发送一个信号gotNewData(Imagedata)
,该信号连接到QWidget
updateImage(Imagedata)
插槽。在updateImage(Imagedata)
插槽中,我将从服务器获取的图像数据转换为QImage
,缩放图像并创建QPixmap
,我将其设置为QLabel
。我的问题是,在处理updateImage(Imagedata)
函数的过程中,套接字会获得其他包含新映像的包,并将信号一次又一次地发送到QWidget
。这是合乎逻辑的,因为套接字线程不关心前一次信号调用调用的函数updateImage(Imagedata)
是否已经完成。我的问题是:是否有一些技巧,我如何能够与QWidget
updateImage(Imagedata)
函数同步我的套接字线程?经常更新QLabel与来自服务器的图像数据
0
A
回答
0
确实有。问题是,如果在处理旧图像时接收到新图像,您希望达到什么目的。如果你想跳过新的并且处理旧到最后,我会建议在发送对象时调用blockSignals - 这会破坏调用者和calle指针,但qt似乎不允许阻止接收信号,只是发送。 修改不会影响性能太多,也不会混淆可能会完成的其他通信网络,可能会在包含标签的窗口小部件中创建代理QObject,然后使用moveToThread()将其移至网络线程并在其上使用blockSignals这个对象。自然地,这个对象需要与发送的实际信号相同的签名信号。创建的对象虽然具有不同的线程关联性,但在逻辑上仍然由GUI小部件拥有,并且应该由它删除。
另一种方法是在您的对象中创建bool变量processing
,如果您正在处理数据,则将其设置为true。在将其设置回false之前,您可以拨打QCoreApplication::processEvents();
来处理事件队列中的所有事件。在你的插槽中,你应该检查是否设置了processing
vaiable,如果是,跳过任何事情。这是一种简单而粗俗的灵魂,但它起作用。请注意,如果您的其他事件处理程序在您的GUI线程中调用processEvents();
(例如,多个此类标签),则某些标签可能会停止获取其数据(冻结)。
在处理完成之前,您可能会试图使用Qt::BlockingQueuedConnection
来阻止网络线程接收任何东西,但是由于许多不同的原因,这是一个坏主意(如果您像这样同步它,那么为什么您需要单独的线程呢?)
相关问题
- 1. 更新来自远程服务器的列表视图数据
- 2. 更新来自服务器的PFUser
- 3. Xcode - 每天更新UITableView(来自服务器的xml数据)
- 4. Sqlite数据库不会更新来自Web服务的数据
- 5. Kendo网格列与来自服务器的图像
- 6. 来自服务器的图片未更新Android
- 7. 验证来自服务器的数据
- 8. 每5秒更换一次图像 - 但来自服务器的图像
- 9. 来自SQL服务器C#中的JavaScript数组数据来自#
- 10. Spring引导编辑json异常与来自服务器响应的数据
- 11. 来自OPC服务器的c#实时图表/图形来自OPC服务器
- 12. 当服务器数据库更新时更新sqlite数据库
- 13. UITableView与来自服务器的多维阵列数据
- 14. 来自服务器的Android更新TextView(新闻源)
- 15. Android:更新一些天气来自服务器每X小时的数据
- 16. 如何自动更新数据库服务器上的mysql数据库更改?
- 17. JqGrid从服务器更新数据
- 18. 更新服务器处理数据表与其他参数源
- 19. Angularjs服务数据更新
- 20. ADO.Net数据服务更新
- 21. 使用QScrollArea和QLabel显示来自流的图像
- 22. 服务器数据库更改后自动刷新yii2网格
- 23. AngularJS通过服务自动更新控制器数据
- 24. MySql合并来自远程数据库服务器的数据
- 25. 从服务器MySql数据库更新本地服务器MySql数据库
- 26. 使用自定义数据将图像上传到服务器
- 27. 为什么我的来自远程服务器的图像显得更小?
- 28. 请求服务器的图像和服务器响应与图像
- 29. 无法使用PHP MySQL更新数据库,其中数据来自AngularJS1.2服务
- 30. 来自服务器的Android实时更新
我把套接字放在线程中,因为用户应该可以使用GUI。就我而言,如果用户按下某个按钮,一些命令将被发送到服务器。为了发送命令,我使用其他套接字连接。这就是为什么我把图像接收器套接字放在线程中,它不应该阻止用户与程序的交互。 – 2012-01-02 00:07:16
我的意思是'如果你会像这样同步它,那么为什么你需要单独的线程?'无论如何,第一个解决方案应该是一个好主意。 – 2012-01-02 01:24:03