如何知道有多少任务已经完成?

How to know how many tasks are already completed?

在 C++ Builder 10.3.3 中,我使用了以下测试代码:

int count = 500;
 _di_ITask* task = new _di_ITask[count];
ProgressBar1->Position = 0;
for(int i = 0; i < count; i++){
    task[i] = TTask::Create([i, this](){
        // do something...
        Sleep(10);
    });
    task[i]->Start();
    //ProgressBar1->Position = numberOfFinishedTasks;
    //Application->ProcessMessages();
}
TTask::WaitForAll(task, count - 1);

在本例中有 500 个测试任务,我希望 ProgressBar 组件显示当前已完成任务的数量。我不知道如何获取该信息。谢谢!

最简单的解决方案是让 lambda 在退出前更新 ProgressBar。您可以为此使用 TThread::Synchronize() or TThread::Queue()

问题是,TTask::WaitForAll() 是一种阻塞方法,根本不抽取主 UI 消息队列,因此 Synchronize()/Queue() 请求不会完全处理。您可以通过在带有超时的循环中调用 WaitForAll() 来解决这个问题,这样循环就可以根据需要发送消息。

尝试这样的事情:

int count = 500;
std::vector<_di_ITask> task(count);

ProgressBar1->Position = 0;
ProgressBar1->Min = 0;
ProgressBar1->Max = count;
ProgressBar1->Step = 1;

for(int i = 0; i < count; ++i){
    task[i] = TTask::Create(
        [i, this](){
            // do something...
            TThread::Queue(nullptr, ProgressBar1->StepIt);
        }
    );
    task[i]->Start();
}

while (!TTask::WaitForAll(task.data(), count - 1, 1000)){
    Application->ProcessMessages();
}