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

Tra*_*cer 1 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);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,有 500 个测试任务,我希望我的 ProgressBar 组件显示当前已完成任务的数量。我不知道如何获得这些信息。谢谢!

Rem*_*eau 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();
}
Run Code Online (Sandbox Code Playgroud)