0

今日は、個人プロジェクト用のタスク マネージャーを作ろうとしています。

私は次の方法を書きました:

template<class Callback, class... Args>
void ThreadManager::AddTaskToRun(Callback&& fun,     Args&&... args)
{
task_handle<function<void()>> task = make_task([&]()
{
    fun(forward<Args>(args)...);
});

/* Another code */
}

そして、私は次のサンプルでそれを呼び出します:

void Test(int taskId)
{
wcout << "Hello " << taskId << endl;
}


threadManager.AddTaskToRun(Test, 1);
threadManager.AddTaskToRun(Test, 2);
threadManager.AddTaskToRun(Test, 3);

int x = 0;
threadManager.AddTaskToRun(Test, x);
x++;
threadManager.AddTaskToRun(Test, x);
x++;
threadManager.AddTaskToRun(Test, x);

問題は、デバッグ モード (Visual Studio 2013 を使用) で、次の結果が得られることです。

Hello 1 (first test)
Hello 2
Hello 3

Hello 2 (second test, with a variable in argument)
Hello 2
Hello 2

2番目のテストには大きな問題がありますよね?:-)

そして、リリースモードでテストすると:

こんにちは 3 こんにちは 3 こんにちは 3

こんにちは 2 こんにちは 2 こんにちは 2

良い。奇妙だと思います。ウェブで検索しましたが、何も見つかりませんでした。「make_task」または「create_task」(PPL)の外で関数を実行すると、すべての結果が良好であることがわかりました。

template<class Callback, class... Args>
void ThreadManager::AddTaskToRun(Callback&& fun,     Args&&... args)
{
fun(forward<Args>(args)...);

/* Another code */
}

誰でも私を助ける考えがありますか?

前もって感謝します

4

1 に答える 1

0

数時間のテストの後、解決策を見つけました。私はthread.hファイルを検索し、コンストラクター_Decay_copyで発見し、メソッドでそれを使用しようとしました:

template<class Callback, class... Args>
void ThreadManager::AddTaskToRun(Callback&& fun,     Args&&... args)
{
task_handle<function<void(void)>> task = bind(_Decay_copy(forward<Callback>(fun)), _Decay_copy(forward<Args>(args))...);

/* Another code */
}

このタスクtask_groupで使用すると、正常に動作します。

ありがとうございました :-)

于 2014-03-11T16:16:12.320 に答える