3

编写扫描程序。在它读取一个图像后,它调用convertToPDF()然后读取下一个图像。RUN FINISHED; Segmentation fault: 11;当在线程中声明 Image 时,程序段错误 ( )。相同的代码在主线程中运行时可以正常工作,我将其thrPDF移至convertToPDF以确保。所以我认为这与我头脑中的 Magick++ 内存分配有关。任何帮助将非常感激。

void ScanWindow::convertToPDF(string fileName)
{
   pthread_t convert;
   string* args = new string(fileName);
   void *thrPDF(void*);
   pthread_create(&convert,NULL,thrPDF,args);
}

void *thrPDF(void* a)
{
   string* fName = (string*) a;
   string newFile = fName->substr(0,fName->length()-3) + "pdf";

   Magick::Image img(*fName);  // this is the line that seg faults
   img.magick("pdf");
   img.write(newFile);

   pthread_exit(0);
}

这是调用堆栈:
omp_get_max_threads(?)
GetOpenMPMaximumThreads
inlined AcquirePixelCache(?)
AcquireImage(?)
Magick::ImageRef::ImageRef(?)
Magick::Image::Image(?)
thrPDF(?)
_pthread_start(?)
thread_start( ?)

4

1 回答 1

1

如果尚未完成,您应该在使用 API 的其余部分之前在主/原始线程中调用 InitializeMagick(NULL)(或 InitializeMagick(*argv))。这可能有助于解决一些与线程相关的问题。使用 GraphicsMagick 中包含的 Magick++,这是现代版本中的绝对要求。

于 2013-07-14T20:12:59.037 回答