Qt:以最小延迟在多个线程之间传递大量数据

时间:2016-07-19 19:24:11

标签: c++ qt pointers reference signals-slots

我的目标是创建一个使用编码(和可选加密)静止图像的视频播放器。我的主线程创建了以下三个类:

player_class:图像请求每隔40-50ms通过一个信号发出。

extract_frames_class:从包装器中提取编码和加密的内容。

handle_frames_class:该类创建另外30个解码线程并将它们存储在一个数组中。然后,该类接收帧请求并将其传递给extract_frames_class。在获得提取的数据之后,它检查哪个解码线程当前是空闲的,并将数据传递给解码器。解码器完成后,信号(包含图像)将通过handle_frames类发送回播放器。

这种方法效果很好。我得到~20 fps,没关系。目标是稳定的25.不幸的是,发送大型QByteArrays(包含编码数据)和QImages似乎会产生额外的延迟。我的新想法如下:

为什么不创建一个包含所有可以/将要在线程中传递的信息的类,为要在player_class中解码的每个帧存储一个实例,并向线程发送引用或指针而不是传递数据本身?

class request: public QObject {
    Q_OBJECT
public:
    int type; // 1 = request, 2 = response, 3 = kill processes
    QImage img; // decoded image
    QByteArray rawData; // extracted raw data of image to be decoded
    qint64 frameNr; // frame number in image sequence
    int decode_wait; // time to wait between decoding request.
    int decode_total = 1; // nr of images to decode
    int decode_time; // time took decoding images
    int decode_layer; // layer n of image to decode
};

我的班级实例已创建并发出:

requests[i] =  new request();
requests[i]->frameNr = decoding_frame;
requests[i]->decode_layer = decode_layer;
emit getFrames(requests[i]); // send out request

以下是我的连接声明:

connect(player_class, SIGNAL(getFrames(request*)), extract_frames_class, SLOT(slotFrameExtractRequests(request*)));

connect(extract_frames_class, SIGNAL(sendRawData(request*)), handle_frames_class, SLOT(slotRawData(request*)));

connect(handle_frames_class, SIGNAL(sendImage(request*)), player_class, SLOT(receiveDecodedImage(request*)), Qt::DirectConnection);

解码后的数据一返回,实例就会被删除。这种方法很有效,但解码速度降低到1fps左右。有人知道怎么来的吗?

在主线程中创建类实例之前,使用该语句根据qt文档qRegisterMetaType<request>("request");传递自定义类会导致编译错误。

非常感谢有关如何解决此问题的提示!

0 个答案:

没有答案