2012-01-01 68 views
0

我正在写一个程序,它应该在QWidget中显示QLabel中的图像。图像从服务器发送。首先,我有一个负责连接和从服务器接收数据的线程。当收到数据时,套接字线程将发送一个信号gotNewData(Imagedata),该信号连接到QWidgetupdateImage(Imagedata)插槽。在updateImage(Imagedata)插槽中,我将从服务器获取的图像数据转换为QImage,缩放图像并创建QPixmap,我将其设置为QLabel。我的问题是,在处理updateImage(Imagedata)函数的过程中,套接字会获得其他包含新映像的包,并将信号一次又一次地发送到QWidget。这是合乎逻辑的,因为套接字线程不关心前一次信号调用调用的函数updateImage(Imagedata)是否已经完成。我的问题是:是否有一些技巧,我如何能够与QWidgetupdateImage(Imagedata)函数同步我的套接字线程?经常更新QLabel与来自服务器的图像数据

回答

0

确实有。问题是,如果在处理旧图像时接收到新图像,您希望达到什么目的。如果你想跳过新的并且处理旧到最后,我会建议在发送对象时调用blockSignals - 这会破坏调用者和calle指针,但qt似乎不允许阻止接收信号,只是发送。 修改不会影响性能太多,也不会混淆可能会完成的其他通信网络,可能会在包含标签的窗口小部件中创建代理QObject,然后使用moveToThread()将其移至网络线程并在其上使用blockSignals这个对象。自然地,这个对象需要与发送的实际信号相同的签名信号。创建的对象虽然具有不同的线程关联性,但在逻辑上仍然由GUI小部件拥有,并且应该由它删除。

另一种方法是在您的对象中创建bool变量processing,如果您正在处理数据,则将其设置为true。在将其设置回false之前,您可以拨打QCoreApplication::processEvents();来处理事件队列中的所有事件。在你的插槽中,你应该检查是否设置了processing vaiable,如果是,跳过任何事情。这是一种简单而粗俗的灵魂,但它起作用。请注意,如果您的其他事件处理程序在您的GUI线程中调用processEvents();(例如,多个此类标签),则某些标签可能会停止获取其数据(冻结)。

在处理完成之前,您可能会试图使用Qt::BlockingQueuedConnection来阻止网络线程接收任何东西,但是由于许多不同的原因,这是一个坏主意(如果您像这样同步它,那么为什么您需要单独的线程呢?)

+0

我把套接字放在线程中,因为用户应该可以使用GUI。就我而言,如果用户按下某个按钮,一些命令将被发送到服务器。为了发送命令,我使用其他套接字连接。这就是为什么我把图像接收器套接字放在线程中,它不应该阻止用户与程序的交互。 – 2012-01-02 00:07:16

+0

我的意思是'如果你会像这样同步它,那么为什么你需要单独的线程?'无论如何,第一个解决方案应该是一个好主意。 – 2012-01-02 01:24:03

相关问题