在 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 组件显示当前已完成任务的数量。我不知道如何获得这些信息。谢谢!
最简单的解决方案是让 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)
| 归档时间: |
|
| 查看次数: |
193 次 |
| 最近记录: |