c++ - 如何在 C++ Builder 中动态设置任务数(_di_ITask)?
问题描述
我有以下代码(C++ Builder 10.3.3):
bool isPrime(int n){
if (n <= 1)
return false;
for(int i = 2; i < n/2; i++)
if(!(n%i))
return false;
return true;
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{
auto start_t = high_resolution_clock::now();
_di_ITask task[50000];
int count = 50000;
// _di_ITask* task = new _di_ITask[count]; // compiles, but gives incorrect end result
vector<int> prim;
for(int i = 0; i < count; i++){
task[i] = TTask::Create([i, this, &prim](){
if(isPrime(i)){
EnterCriticalSection(&cs);
prim.push_back(i);
LeaveCriticalSection(&cs);
};
});
task[i]->Start();
}
TTask::WaitForAll(task,(sizeof(task)/sizeof(task[0])-1));
auto end_t = high_resolution_clock::now();
auto duration = duration_cast<milliseconds>(end_t - start_t).count();
ShowMessage("Prime count: " + String(prim.size()) + " Time: " + IntToStr(duration) + " ms.");
}
运行此代码时,我总是得到 5134。但是,我想动态设置任务数(_di_ITask 对象)而不是固定它。所以与其
_di_ITask task[50000];
我想要这样的东西:
int count = 50000;
_di_ITask* task = new _di_ITask[count]();
这可以编译,但最后我总是得到不正确的(随机)结果。我究竟做错了什么?
解决方案
我得到了它。反而
TTask::WaitForAll(task,(sizeof(task) / sizeof(task[0]) - 1));
我需要使用
TTask::WaitForAll(task, (sizeof(task[0]) * count) / sizeof(task[0]) - 1);
或者简单地说(由 Remy Lebeau 建议):
TTask::WaitForAll(task, count - 1);
推荐阅读
- angular - 如何以角度创建端点以上传图像?
- shiny - Highcharter - Clickable Pie Chart - 如何从在 Shiny 中单击饼图的切片中获取类别名称?
- google-cloud-platform - GCP Bigquery 授权视图
- python - 如何区分视差图像的好坏
- xml - 使用 Python 连接 request.post 的 URL
- c# - 在 C# 中更新远程 Function App 应用程序设置
- php - 如何使用 WooCommerce is_shop 条件标签排除搜索结果
- java - 类示例不是抽象的,也没有实现 android.os.Parcelable 中定义的 fun writeToParcel()
- reactjs - history.push() 在将 History 升级到 5.0.0 后停止工作
- reactjs - 有没有办法将 react-apollo 绑定到单个组件而不是包装整个应用程序?