0

我正在通过 QtConcurrent::mapped 处理一堆重数据(其中 1000 个或更多)

 auto result = QtConcurrent::mapped(image_id, std::bind<std::pair<QString, QImage>>(&mainWindow::process_image_impl, this, ph::_1));

代替

void process_image_impl(int image_id)
{
  //.......lots of codes

  {
    QMutexLocker locker(&mutex);
    morphology.close(image, image); //I don't want to lock this operation
  }

  //lots of codes
}

我想做类似的事情

void process_image_impl(int image_id)
{
  //.......lots of codes


    morphology[thread_id].close(image, image); //I don't want to lock this operation


  //lots of codes
}

在函数 process_image_impl 中,我调用了一个名为“morphology”的类,我不想在处理图像时锁定“morphology”类,但是如果我不锁定它可能会导致未定义的行为。而不是锁定过程中,我想把“morphology”类放在一个容器中,根据QThreadPool中的线程调用每个“morphology”,这可能吗?或者您有其他建议吗?谢谢

4

2 回答 2

0

如果形态只需要在一个线程内访问

QThreadStorage<Morphology> morphology;

void process_image_impl(int image_id) {
  //lots of codes
  if (!morphology.hasLocalData()) morphology.setLocalData(Morphology());
  morphology.localData().close(image, image);
  //lots of codes
}

如果还需要在线程之外访问形态

template <class T>
class ThreadSafeStack: private QStack<T*> {
  QMutex mutex;
public:
  T* pop() {
    QMutexLocker locker(&mutex);
    return !isEmpty() ? QStack::pop() : new T;
  }

  void push(T* &t) {
    QMutexLocker locker(&mutex);
    QStack::push(t);
  }
};

ThreadSafeStack<Morphology> stack;

void process_image_impl(int image_id) {
  //lots of codes
  Morphology *morphology = stack.pop();
  morphology->close(image, image);
  stack.push(morphology);
  //lots of codes
}
于 2014-02-05T00:25:41.893 回答
0

多线程是可能的解决方案之一,具体取决于您的“形态”类将被调用多少次以及您将使用什么操作系统来运行您的代码以及您将使用什么处理器等等。以上所有内容都会影响您的代码在运行时的性能,这取决于您的期望。如果您想采用多线程方法,您只需创建一个指向“形态”类的指针和另一个指向“QThread”的指针,然后使用“moveToThread(&thread)”将其移动到线程。例如检查这个链接:如何在 Qt 中实际和正确地实现多线程

如果您希望程序响应并且不被锁定在处理中,那么多线程也是一种方法

于 2013-04-23T22:34:13.223 回答