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