Добрый вечер.
Есть 5 IP-камер. Делаю вывод изображений от всех камер в 1 окне.
Для отдельно взятой камеры создал класс(потомок QWidget), который содержит QLabel, создаю отдельный поток, в который передаю указатель на этот виджет.
В потоке использую QTcpSocket, отправляю запрос камере, получаю поток данных MJPEG. К сигналу readyRead подсоединил слот:
QByteArray readed = socket->readAll();
buffer.append(readed);
updateImage();
if (buffer.size() > MAX_BUFFER_SIZE) {
buffer.remove(0, MAX_BUFFER_SIZE);
}
Функция updateImage() выглядит так:
int pos1 = buffer.indexOf("\r\n\r\n");
if (pos1 != -1) {
int pos2 = buffer.indexOf("\r\n\r\n", pos1 + 4);
if (pos2 != -1) {
QByteArray ba = buffer.mid(pos1 + 4, pos2 - pos1 - 4);
QImage image_ = QImage::fromData(ba, "JPEG");
if (!image_.isNull()) {
QMetaObject::invokeMethod(surface, "setNewImage", Qt::QueuedConnection, Q_ARG(QImage, image_));
}
buffer.remove(0, pos2);
}
}
Где surface - это указатель на виджет, его слот setNewImage() рисует на QLabel кадр:
label->setPixmap(QPixmap::fromImage(image));
И все бы ничего, с одной камерой работает хорошо, но когда 5 таких виджетов скомпоновать вместе, запускается уже 5 таких потоков и загрузка процессора достигает 70-90% на Windows 7 x64 (Qt 4.7.4), на Ubuntu 13.04 (32-разрядная, Qt 4.8 ) системный монитор показывает загрузку около 30%.
Вопросы такие:
Можно ли как-то уменьшить загрузку процессора, особенно под Windows?
Почему такая загрузка ЦП?
Возможно, следует использовать другой подход, алгоритм и т.п.?
Рад буду выслушать любые ваши предложения, критику и уточняющие вопросы.