0

注意:我对使用线程池不是很熟悉,这从下面的代码中可能很明显。我的印象是我可以将许多值推送到这个队列中,然后它会等待一个线程完成然后移动到下一个线程,系统将处理要运行的线程数的同步。

我正在尝试使用 ThreadPool::QueueUserWorkItem(waitcallback, num) ,其中 num 的值根据某些先前的算法迭代到动态值。我遇到的问题是程序在它变得太高时崩溃。

WaitCallback^ wcb = gcnew WaitCallBack(this, &createImage);
for(int i = 0; i < numBlocks; i++)
{
    ThreadPool::QueueUserWorkItem(wcb, i);
}

我收到消息“运行时错误!此应用程序已请求运行时以不寻常的方式终止它。请联系应用程序的支持团队以获取更多信息。”

我最反感的是 numBlocks = 644。

4

1 回答 1

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++。

于 2013-03-26T14:13:30.297 回答