首页 > 解决方案 > 如何在 C++ Builder 中动态设置任务数(_di_ITask)?

问题描述

我有以下代码(C++ Builder 10.3.3):

bool isPrime(int n){
    if (n <= 1)
        return false;
    for(int i = 2; i < n/2; i++)
        if(!(n%i))
            return false;
    return true;
}

void __fastcall TForm1::Button3Click(TObject *Sender)
{
    auto start_t = high_resolution_clock::now();
    _di_ITask task[50000];
    int count = 50000;
    // _di_ITask* task = new _di_ITask[count]; // compiles, but gives incorrect end result

    vector<int> prim;
    for(int i = 0; i < count; i++){
        task[i] = TTask::Create([i, this, &prim](){
        if(isPrime(i)){
            EnterCriticalSection(&cs);
            prim.push_back(i);
            LeaveCriticalSection(&cs);
            };
        });
        task[i]->Start();
    }
    TTask::WaitForAll(task,(sizeof(task)/sizeof(task[0])-1));
    auto end_t = high_resolution_clock::now();
    auto duration = duration_cast<milliseconds>(end_t - start_t).count();
    ShowMessage("Prime count: " + String(prim.size()) + " Time: " + IntToStr(duration) + " ms.");
}

运行此代码时,我总是得到 5134。但是,我想动态设置任务数(_di_ITask 对象)而不是固定它。所以与其

_di_ITask task[50000];

我想要这样的东西:

int count = 50000;
_di_ITask* task = new _di_ITask[count]();

这可以编译,但最后我总是得到不正确的(随机)结果。我究竟做错了什么?

标签: c++task-parallel-libraryc++builder

解决方案


我得到了它。反而

TTask::WaitForAll(task,(sizeof(task) / sizeof(task[0]) - 1));

我需要使用

TTask::WaitForAll(task, (sizeof(task[0]) * count) / sizeof(task[0]) - 1);

或者简单地说(由 Remy Lebeau 建议):

TTask::WaitForAll(task, count - 1);

推荐阅读