2015-04-29 2 views
0

Я хочу написать небольшую программу, которая сжимает все файлы из каталога с помощью qCompress QByteArray.Как использовать QtConcurrent для qCompress на QByteArray?

Однако я хочу запустить сжатие в многопоточной среде с помощью QtConcurrent. Но у меня есть некоторые проблемы.

Вот мой код:

FilePool pool(folder,suffix); 
QFutureWatcher<QString> watcher; 
QProgressDialog progressDialog; 


connect(&watcher,SIGNAL(progressRangeChanged(int,int)),&progressDialog,SLOT(setRange(int,int))); 

connect(&watcher,SIGNAL(progressValueChanged(int)),&progressDialog,SLOT(setValue(int))); 

connect(&progressDialog,SIGNAL(canceled()),&watcher,SLOT(cancel())); 

QFuture<QString> future = QtConcurrent::filtered(pool,FindInFile(search)); 
QString text; 

watcher.setFuture(future); 

progressDialog.exec(); 

future.waitForFinished(); 
//Test for compressing file 

QFile outFile("testCompress.ecf"); 
outFile.open(QIODevice::WriteOnly); 
QByteArray nonCompressedData; 
foreach(const QString &file,future.results()){ 
    //Fichier d'entrée 
    QFile inFile(file); 
    inFile.open(QIODevice::ReadOnly); 
    nonCompressedData.append(inFile.readAll()); 
    inFile.close(); 
    text += file + "\n"; 
} 

//QByteArray compressedData(qCompress(nonCompressedData,9)); 
//PROBLEM HERE 
QFuture<QByteArray> futureCompressor = QtConcurrent::filtered(nonCompressedData,qCompress); 
futureCompressor.waitForFinished(); 
QByteArray compressedData = futureCompressor.results(); 

outFile.write(compressedData); 

Проблема заключается в том, что компилятор не поднять мне ошибки

Во-первых: Нет функции согласования для вызова к фильтруется (& QByteArray,).

Во-вторых: конвертируется из QList в нескалярный тип QByteArray.

Итак, мой вопрос в том, можно ли делать то, что я хочу?

Заранее спасибо

+0

Можно, конечно, сжимать массив в отдельном потоке. Но так, как вы пытаетесь это сделать ... это немного пахнет: «Давайте возьмем случайную функцию от QtConcurrent, случайно передадим ему некоторые параметры и надеемся на лучшее» – Greenflow

+0

Тогда вы можете вести меня наилучшим образом сделать это? – JohnnyBeGoody

+0

Вы можете написать функцию, которая сжимает ваш QByteArray с помощью qCompress, а затем выполняет эту функцию в другом потоке с помощью QtConcurrent :: run. – Greenflow

ответ

1

Не уверен, если qt4 может справиться с этим.

QList<QByteArray> list; 
...add ByteArrays to list... 
auto wordMapFn = [](QByteArray &arr){arr=qCompress(arr, 9);}; 
QFuture<void> f = QtConcurrent::map(list,wordMapFn); 

Это сжимает все QByteArrays в списке. Если вы хотите сохранить несжатые массивы, используйте карту вместо карты. wordMapFn должен быть соответствующим образом скорректирован. Если вы хотите сжать только один QByteArray QtConcurrent :: run, возможно, будет более подходящим.

Обратите внимание на срок службы списка.

+0

Благодарим за ответ, я попробую это. – JohnnyBeGoody

+0

Хорошо, это отлично работает. Но теперь я задаю другой вопрос. Можно ли превратить эту лямбду в класс, который перегружает оператора? Потому что, будучи новым в C++, я действительно не понимаю лямбда-выражения. – JohnnyBeGoody

+0

Хорошо, все сделано, я нашел, как написать класс вместо выражения лямбда. Спасибо за вашу драгоценную помощь – JohnnyBeGoody

 Смежные вопросы

  • Нет связанных вопросов^_^