1

QtConcurrent を使用して、特定のタスクを並行して実行しています。ただし、マップの代わりにmappedReducedを使用するように変更すると、問題が発生しました。

これが私が使用したコードです:

struct ProcMapWrapper {
  ConcurrentProcessTask *instance;
  ProcMapWrapper(ConcurrentProcessTask *w): instance(w) {}
  QString & operator()(const QString& data) {
    return instance->map(data);
  }
  ProcMapWrapper(const ProcMapWrapper & src)
  {
      instance = src.instance;
  }
  typedef QString result_type;
};

struct ProcReduceWrapper {
  ConcurrentProcessTask *instance;
  ProcReduceWrapper(ConcurrentProcessTask *w): instance(w) {}
  void operator()(int &number, const QString &fname) {
    return instance->reduce(number,fname);
  }
  ProcReduceWrapper(const ProcReduceWrapper & src)
  {
      instance = src.instance;
  }
  typedef int result_type;
};

ProcMapWrapper mw(this);
ProcReduceWrapper rw(this);
futureWatcher.setFuture(QtConcurrent::mappedReduced(_files.begin(),_files.end(),mw,rw));

アイデアは、processOneItem 関数を使用して入力文字列から stage1Data 構造体を生成し、reduce 関数でクリアして結果を適切なコンテナーに保存することです。

私は、これらのコード スニペットを参照するこのソース ファイルにたどり着いた、ちょっとした調査を行いました。そこには、マップファンクターのテンプレートが次のように指定されています。

struct Scaled 
{ 
     Scaled(int size) 
     : m_size(size) { } 

     typedef QImage result_type; 

     QImage operator()(const QImage &image) 
     { 
         return image.scaled(m_size, m_size); 
     } 

     int m_size; 
}; 

 QList<QImage> images = ...; 
 QFuture<QImage> thumbnails = QtConcurrent::mapped(images, Scaled(100));

これは実際に QtConcurrent の機能で機能しますが、同じパターンで reduce ファンクターを作成しようとすると、これらのエラーが再び発生しますmapmapped

..\qt_photoaud\task.cpp(230): エラー C2893: 関数テンプレート 'QFuture::ResultType> QtConcurrent::mappedReduced(Iterator,Iterator,MapFunctor,ReduceFunctor,QtConcurrent::ReduceOptions)' を次のテンプレート引数で特殊化できませんでした: 'QList::iterator' with [ T=QString ] 'ProcMapWrapper' 'ProcReduceWrapper' ..\qt_photoaud\task.cpp(230) : エラー C2783: 'QFuture QtConcurrent::mappedReduced(Iterator,Iterator,MapFunctor,ReduceFunctor,QtConcurrent ::ReduceOptions)' : 'ResultType' のテンプレート引数を推測できませんでした c:\qt\4.8.4\include\qtcore../../src/corelib/concurrent/qtconcurrentmap.h(152) : ' の宣言を参照してくださいQtConcurrent::mappedReduced' ..\qt_photoaud\task.cpp(230) :エラー C2893: 関数テンプレートの特殊化に失敗しました 'QFuture::ResultType> QtConcurrent::mappedReduced(const Sequence &,MapFunctor,ReduceFunctor,QtConcurrent::ReduceOptions)' 次のテンプレート引数: 'QList::iterator' with [ T=QString ] 'QList::iterator' with [ T=QString ] 'ProcMapWrapper' ..\qt_photoaud\task.cpp(230): エラー C2783: 'QFuture QtConcurrent::mappedReduced(const Sequence &,MapFunctor,ReduceFunctor,QtConcurrent::ReduceOptions )' : 'ResultType' c:\qt\4.8.4\include\qtcore../../src/corelib/concurrent/qtconcurrentmap.h(125) のテンプレート引数を推測できませんでした: 'QtConcurrent:: の宣言を参照してくださいマップされたReduced'

reduce functor は本当に定義および/または認識されていますか? QtPrivate::ReduceResultType::ResultType はどのように機能しますか? 何が必要ですか?

編集: functor が boost::function と互換性があると仮定して、reduce functor で first_argument_type、second_argument_type、arg1_type、および arg2_type を指定しようとしました。しかし、それは何の助けにもなりませんでした。

4

1 に答える 1

2

これが私のために働いたものです:

struct concurrentProcessDBMapper
{
    typedef stage1Data result_type;
    stage1Data operator()(QString fname)
    {
        return concurrentProcessDBMap(fname);
    }
};

struct concurrentProcessDBReducer
{
    DatabaseConcurrentProcessTask *instance;
    concurrentProcessDBReducer(DatabaseConcurrentProcessTask *i)
    {
        instance = i;
    }

    void operator()(int & number, const stage1Data in)
    {
        //concurrentProcessDBReduce
        instance->reduce(number,in);
    }
};
...
    QFutureWatcher<int> futureWatcher;

    QList<QString> _filesInWork;

...
futureWatcher.setFuture(
     QtConcurrent::mappedReduced
         <int, QList<QString>, concurrentProcessDBMapper,concurrentProcessDBReducer>
                            (_filesInWork,concurrentProcessDBMapper(),concurrentProcessDBReducer(this)));
...

要約すると、-(map)->-(reduce)-> のような型変換では、map functor には、stage1Data として定義された result_type があり、reduce functor には、まったく定義された result_type がありません。Future ウォッチャーには型指定が reduce result (つまり、最初の out 引数の型) として定義されています (私の場合は int)。mappedReduced のテンプレート パラメーターは明示的に定義されています。

于 2013-07-02T06:13:49.670 に答える