QtConcurrent Map 不能使用 Class 方法
QtConcurrent Map Cannot Use Class Method
你好,我正在尝试将 QList 传递给 QtConcurrent::Map 函数,但它无法启动,我不明白为什么,也许有人知道可能是什么问题?
这是Class方法代码
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);
^
您将 find_file
视为静态方法,而不是实例方法。有两种解决方案:
将find_file
转为静态方法
将实例传递给 map
: QtConcurrent::map(dirs_lists, &MainWindow::find_file, this)
.
当然,无论哪种情况,您都必须将 find_file
设计为线程安全的。
您不能像这样在 QtConcurrent::map
中使用成员函数。文档状态:QtConcurrent::map(), QtConcurrent::mapped(), and QtConcurrent::mappedReduced() accept pointers to member functions. The member function class type must match the type stored in the sequence。所以在你的情况下,你只能在 QtConcurrent::map
.
中使用 QStringList
成员函数
你好,我正在尝试将 QList 传递给 QtConcurrent::Map 函数,但它无法启动,我不明白为什么,也许有人知道可能是什么问题?
这是Class方法代码
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); ^
您将 find_file
视为静态方法,而不是实例方法。有两种解决方案:
将
find_file
转为静态方法将实例传递给
map
:QtConcurrent::map(dirs_lists, &MainWindow::find_file, this)
.
当然,无论哪种情况,您都必须将 find_file
设计为线程安全的。
您不能像这样在 QtConcurrent::map
中使用成员函数。文档状态:QtConcurrent::map(), QtConcurrent::mapped(), and QtConcurrent::mappedReduced() accept pointers to member functions. The member function class type must match the type stored in the sequence。所以在你的情况下,你只能在 QtConcurrent::map
.
QStringList
成员函数