私は次のコードを使用しキャプチャのstd ::機能
struct WorkData
{
std::string name;
std::function<void(std::string)> Callback;
WorkData(){};
WorkData(const WorkData& other)
{
name = other.name;
Callback = std::ref(other.Callback);
}
};
WorkData data; // this is the data to pass to queue_task() function bellow
data.Callback = std::bind(&ResultProcessor::Handler, resProc, std::placeholders::_1);
template <typename Functor>
void queue_task(Functor& fn, WorkData& workData)
{
group.run([&fn, workData](){
workData.Callback("resultComming"); // runtime ERROR- access violation
});
}
queue_task機能キューは(上からgroup.run(ラムダ)を呼び出すことによって)別のスレッドで非同期的に行われることに努めています。私が経験している問題は、workData.Callback()を呼び出す際にアクセス違反が発生することです。
group.run()の実行時にqueue_task()が実行されたときの状態のコピーを持つように、workDataを値で取得したいからです。と呼ばれる。クラッシュラインが
私はEDITを私の質問に添えました。私はstd :: refを使用します。そうしないと、ResultProcessorの別のインスタンスでworkData.Callback( "resultComming")を呼び出すことになります。 – Ghita
その場合、関数ではなくResultProcessorで 'std :: ref'を使用する必要がありますオブジェクト自体。つまり、最後のコードブロックで 'std :: ref(resProc)'をしてから、あなたのコピーコンストラクタで 'std :: function'の真のコピーを使うべきです。 –
ResultProcessorインスタンスはstd :: function
Ghita