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

时间:2019-12-07 08:24:25

标签: delphi c++builder

在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组件显示当前已完成任务的数量。我不知道该如何获取该信息。谢谢!

1 个答案:

答案 0 :(得分:6)

最简单的解决方案是让lambda本身在退出前更新ProgressBar。您可以为此使用TThread::Synchronize()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();
}
相关问题