2016-05-30 8 views
0

QtConcurrent :: Map関数にQListを渡そうとしていますが、開始に失敗し、なぜ、何か問題があるかもしれないことがわかっていますか?QtConcurrentマップはクラスメソッドを使用できません

これはクラスメソッドのコード

void MainWindow::find_file(QStringList &lst){ 
    QString fl_name = ui->ln_FlName->text(); 
    QRegExp exp; 
    exp.setPattern(".*/("+ui->ln_FlName->text()+").*"); 
    QRegExp exp_2; 
    exp.setPattern(".*/("+ui->ln_FlName->text()+")"); 
    foreach(const QString &str,lst) 
     { 
     // Do some work... 
     }} 

であり、私はこの方法に

void MainWindow::on_btn_start_clicked(){ 
QDir start_path(ui->ln_Dir->text()); 
QList<QFuture<QStringList> > future_list; 
QList<QStringList> dirs_lists; 
QStringList temp_dir_list; 
QList<QString> lst_str; 
foreach(const QFileInfo fl_inf,start_path.entryInfoList(QDir::NoDotAndDotDot|QDir::Dirs)) 
{ 
    if(fl_inf.isDir()) 
    { 
     //Here I use QtConcurrent::run with other method and it works fine 

     QFuture<QStringList>ft; 
     ft=QtConcurrent::run(this,&MainWindow::File_Search,fl_inf.filePath()); 
     future_list.append(ft); 
     num_ft+=1; 
     temp_dir_list.append(fl_inf.filePath()); 
     lst_str.append(fl_inf.filePath()); 
    } 


} 
dirs_lists.append(temp_dir_list); 
long long int sum = 0; 
for(int i=0;i<future_list.count();i++) 
{ 

    sum += future_list.at(i).result().count(); 
    dirs_lists.append(future_list.at(i).result()); 
} 


//But this doesn't want to work 

QFutureWatcher<void> ft_watcher; 
ft_watcher.setFuture(QtConcurrent::map(dirs_lists,&MainWindow::find_file)); 
} 

およびコンパイラの出力するエラーを実行しようとすると、これはコードです:

error: no matching function for call to 'map(QList&,)' QtConcurrent::map(dirs_lists,MainWindow::find_file); ^

そして

error: no match for call to '(QtConcurrent::MemberFunctionWrapper1) (QStringList&)' map(*it); ^

答えて

1

あなたはfind_fileを静的メソッドであるかのように扱いますが、インスタンスメソッドではありません。 2つの解決方法があります。

  1. find_fileを静的メソッドに変換します。

  2. mapQtConcurrent::map(dirs_lists, &MainWindow::find_file, this)にインスタンスを渡します。

どちらの場合でも、find_fileをスレッドセーフにする必要があります。

+0

あなたの答えをありがとう:) 2番目の解決策は私が探していたものでしたが、うまくいかなかった^エラー: 'map(QList &、void(MainWindow :: *)(QStringList&)、MainWindow * const) ' QtConcurrent :: map(dirs_lists、&MainWindow :: find_file、this); ^私が静的メソッドを作ると、パフォーマンスが私の意見で落ちるよりも、静的メソッドのインスタンスが1つしかないので、私が間違っていれば私を修正してください。 –

関連する問題