我正在编写一个程序,该程序应该在QLabel
的{{1}}中显示图像。图像从服务器发送。首先,我有一个线程负责连接和从服务器接收数据。收到数据后,套接字线程发送一个信号QWidget
,该信号连接到gotNewData(Imagedata)
QWidget
插槽。在updateImage(Imagedata)
广告位中,我将图片数据(我从服务器获取的图片数据转换为updateImage(Imagedata)
,缩放图片并创建QImage
,我将其设置为QPixmap
。我的问题是,在处理QLabel
函数期间,套接字获取带有新图像的其他包,并一次又一次地将信号发送到updateImage(Imagedata)
。这是合乎逻辑的,因为套接字线程不关心由前一个信号调用调用的函数QWidget
是否已经完成。我的问题是:是否有一些技巧,如何将我的套接字线程与updateImage(Imagedata)
QWidget
函数同步?
答案 0 :(得分:0)
另一种方法是在对象中创建bool变量processing
,如果要处理数据,则将其设置为true。在将其设置为false之前,您调用QCoreApplication::processEvents();
来处理事件队列中的所有事件。在你的插槽中,你应该检查是否设置了processing
vaiable,如果是,则跳过做任何事情。这是一个简单粗暴的灵魂,但它有效。请注意,如果您的GUI线程中有其他事件处理程序调用{{1}}(例如,多个标签),则某些标签可能会停止获取其数据(冻结)。
您可能很想使用processEvents();
来阻止网络线程在处理完成之前收到任何内容,但这有很多不同的原因(如果您将其同步,那么为什么需要单独的线程)所有?)