抬头:我对使用threadpool不是很熟悉,从下面的代码中可以看出这一点。我的印象是我可以将许多值推入此队列,然后等待一个线程完成然后移动到下一个线程,系统将处理要运行的线程数的同步。
我正在尝试使用ThreadPool :: QueueUserWorkItem(waitcallback,num),其中num的值根据某些先前的算法迭代到动态值。我遇到的问题是当程序变得太高时程序崩溃。
WaitCallback^ wcb = gcnew WaitCallBack(this, &createImage);
for(int i = 0; i < numBlocks; i++)
{
ThreadPool::QueueUserWorkItem(wcb, i);
}
我收到消息“运行时错误!此应用程序已请求运行时以不寻常的方式终止它。请联系应用程序的支持团队以获取更多信息。”
我最不喜欢的事情是numBlocks = 644。
答案 0 :(得分:1)
很难说导致程序崩溃的原因。最有可能的是,其中一个线程抛出异常,导致程序失效。您必须确定代码中引发异常的位置。
如您所知,ThreadPool::QueueUserWorkItem
将要由线程池处理的项目排队。但是可以有多个线程处理该队列中的项目。例如,您可以有20个池线程,其中15个处理您排队的工作项。
如果你真的有很多要处理的项目,并且你希望它们一次完成一个,为什么不一次只排队一个线程来做一个。我从来没有做过托管C ++,所以我不会尝试用它来编写一个例子。但也许你可以翻译这个C#代码:
void ProcessInBackground(object state)
{
int numBlocks = (int)state;
for (int i = 0; i < numBlocks; ++i)
{
createImage(i);
}
}
然后你可以用:
来调用它ThreadPool::QueueUserWorkItem(ProcessInBackground, numBlocks);
创建一个将按顺序处理项目的单个线程。
我怀疑你可以很容易地将它转换为托管C ++。