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

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

chaoyangxx2003 回答:如何知道已经完成了多少任务?

最简单的解决方案是让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();
}
本文链接:https://www.f2er.com/2958491.html

大家都在问