Qt中的高速数据记录

时间:2014-03-17 18:08:16

标签: c++ multithreading qt

我的应用程序将接受速度高达~50MB / s的数据。我目前的设置是让一个线程从网络接收数据并将其放入另一个线程中的QQueue。然后将此QQueue清空到文件中。这种设置似乎适用于四核2.5GHz i7,但不适用于具有8核的1.8GHz Xeon。两者都有相似数量的RAM。 Xeon的问题是网络上传输的数据和写入文件之间存在数据丢失。我很清楚数据丢失来自于我从网络接收数据的能力。我必须使用QUdpSocket来接收数据,重要的是我收到所有数据但不一定按顺序。有没有人知道如何增加单线程性能,我怀疑这是问题?

void ReceiveThread::readPendingDatagrams() {
    // Process data while socket still has pending datagrams
    while( udpReceiveSocket->hasPendingDatagrams() ) {
        data = new QByteArray;
        // Update the size
        size = udpReceiveSocket->pendingDatagramSize();
        // Reserve the size in the byte array
        data->reserve( size );
        // Store data into qbytearray
        udpReceiveSocket->readDatagram( data->data(), size, &sender,
                                        &senderPort );
        // Send the data to the file thread
        fileWriteThread.addPacketToQueue( data );
    }
}


void FileWriteThread::addPacketToQueue(QByteArray * data) {
    // Lock the mutex
    QMutexLocker locker(&mutex);
    // Add the data packet to the queue
    dataQueue.enqueue( data );

    numReceieved++;
    locker.unlock();
    // Wake the thread that is waiting for this
    dataAdded.wakeOne();
}

void FileWriteThread::run() {    
    forever {
        // Lock the mutex
        QMutexLocker locker(&mutex);
        // Check if the packet queue is empty
        while( dataQueue.isEmpty() ) {
            // Sleep the thread
            dataAdded.wait(&mutex);
        }
        // Get the data from the queue
        data = dataQueue.dequeue();
        locker.unlock();
        // Write the data to the file
        writeDataToBuffer(data);
    }
}

2 个答案:

答案 0 :(得分:1)

避免重复调用new运算符并保​​留。两者都可能很慢。尝试缓存并重用对象。顺便说一句,你在哪里删除使用new分配的对象?

答案 1 :(得分:0)

这有点晚了;-)。但也许您应该考虑使套接字接收缓冲区更大。这不是QT缓冲区而是较低级缓冲区。从QT 5.3开始,可以使用函数setSocketOption,enum QAbstractSocket :: ReceiveBufferSizeSocketOption设置。