C++ 在Qt中运行单独的进程或线程

C++ 在Qt中运行单独的进程或线程,c++,multithreading,qt,concurrency,C++,Multithreading,Qt,Concurrency,我正在写我的第一个真正有用的软件。其中一部分将涉及用户查看图像,并选择接受或拒绝它。执行此操作将导致图像保存到接受或拒绝的文件夹中,并且可能会旋转和/或调整大小 目前,我的旋转/调整大小/保存操作正在暂停程序的执行,但我希望它发生在背景中,以便立即显示下一幅图像 在Qt中这样做的唯一方法是在单独的线程中处理图像,还是有其他方法?我仍然在头脑中旋转C++和QT,所以我不想通过跳入新的领域来迷惑自己!p> Qt具有线程支持。你可能会觉得很有趣,因为它和你描述的有些相似 此外,.此类任务非常适合线程。

我正在写我的第一个真正有用的软件。其中一部分将涉及用户查看图像,并选择接受或拒绝它。执行此操作将导致图像保存到接受或拒绝的文件夹中,并且可能会旋转和/或调整大小

目前,我的旋转/调整大小/保存操作正在暂停程序的执行,但我希望它发生在背景中,以便立即显示下一幅图像


在Qt中这样做的唯一方法是在单独的线程中处理图像,还是有其他方法?我仍然在头脑中旋转C++和QT,所以我不想通过跳入新的领域来迷惑自己!p> Qt具有线程支持。你可能会觉得很有趣,因为它和你描述的有些相似


此外,.

此类任务非常适合线程。尽管如此,您还是应该首先执行一个“普通”函数来执行此操作,当它工作时,添加一个线程来读取队列并调用相同的处理函数


Qt在这方面有很多工具可以帮助您,主要是因为大多数容器都是线程安全的,还有一些线程算法(比如map reduce)。不过,还是要先同步尝试。

已编辑

抱歉,伙计们,我很难将“排队自定义类型示例”链接到需求

从问题中我可以看出,一旦用户接受或拒绝图像,它必须是可选的旋转和/或缩放,并始终保存到特定目录,然后继续下一个图像。(>不再与用户交互)
即使用户离开当前对话框,图像仍必须保存。

“队列自定义类型示例”仅处理一个图像,始终链接到gui,当用户退出对话框时,线程操作停止
因此,如果他从排队的示例启动他的程序,他可能会开始编写一个受互斥保护的映像队列,以便在有挂起的保存操作时可以向列表中添加新映像。否则,用户仍必须等待挂起的操作。
第二个问题是,他可能不想在对话框关闭时等待挂起的保存操作。

为了满足这些要求,我将使用线程池。为线程池提供所需的保存操作,如果还需要旋转/缩放,则使用基于QRunnable的装饰器模式。库正确处理所有排队,即使用户离开当前对话框,也会执行挂起的操作。 最后,我可能会使用排队示例代码加载新图像,并为用户提供加载操作的等待指示。

我的runnables和decorator可能看起来像这样。。。(可能有一些额外的构造函数来替换集合函数),这样我就可以很容易地添加新的操作,比如
QThreadPool::globalInstance()->start(saver)不使用任何低级同步对象

class ImageDecorator : public QRunnable
{
    NextStep nextStep;
public:
    typedef boost::shared_ptr<QRunnable> NextStep;

    ImageDecorator(const NextStep& nextStep) : nextStep(nextStep) {
    }   

    ImageDecorator() : nextStep() {
    }

    // set/get image functions....

protected:
    void next() {
        if( nextStep )
            nextStep->run();
    }
};


class RotateImage : public ImageDecorator
{
public:
    typedef boost::shared_ptr<Image> Image;

    RotateImage(const NextStep& nextStep) : ImageDecorator( nextStep) {
    }   

    RotateImage() : ImageDecorator() {
    }
    // set angle functions....

private:
    void run()
    {
        // rotate the image
        // ...
        next();
    }
};

class ResizeImage : public ImageDecorator
{
public:
    typedef boost::shared_ptr<Image> Image;

    ResizeImage(const NextStep& nextStep) : ImageDecorator( nextStep) {
    }   

    ResizeImage() : ImageDecorator() {
    }
    // set size functions....

private:
    void run()
    {
        // resize the image
        next();
    }
};

class SaveImage : public ImageDecorator
{
public:
    typedef boost::shared_ptr<Image> Image;

    SaveImage(const NextStep& nextStep) : ImageDecorator(nextStep) {
    }   

    SaveImage() : ImageDecorator() {
    }
   // set fileName functions....

private:
    void run()
    {
        // save the image
        next();
    }
};

// save the image 
SaveImage *const saver( new SaveImage() );
saver->setImage( /*use shared pointer*/ );
saver->setFilename( ... );

QThreadPool::globalInstance()->start( saver );

// rotate and save the image 
const ImageDecorator::NextStep saver( new SaveImage() );
saver->setImage( /*use shared pointer*/ );
saver->setFilename( ... );
RotateImage *const rotateAndSave( new RotateImage( saver ) );
rotateAndSave->setImage( /*use shared pointer*/ );
rotateAndSave->setAngle( ... );

QThreadPool::globalInstance()->start( rotateAndSave );


// resize rotate  and  save the image 
const ImageDecorator::NextStep saver( new SaveImage() );
saver->setImage( /*use shared pointer*/ );
saver->setFilename( ... );
const ImageDecorator::NextStep rotateAndSave( new RotateImage( saver ) );
rotateAndSave->setImage(/*use shared pointer*/ );
rotateAndSave->setAngle( ... );
ResizeImage *const resizeRotateAndSave( new ResizeImage( rotateAndSave ) );
resizeRotateAndSave->setImage( /*use shared pointer*/ );
resizeRotateAndSave->setSize( ... );

QThreadPool::globalInstance()->start( resizeRotateAndSave );
类ImageDecorator:public无法命名
{
下一步下一步;
公众:
typedef boost::shared_ptr NextStep;
ImageDecorator(const NextStep&NextStep):NextStep(NextStep){
}   
ImageDecorator():nextStep(){
}
//设置/获取图像函数。。。。
受保护的:
作废下一页(){
如果(下一步)
下一步->运行();
}
};
类RotateImage:公共ImageDecorator
{
公众:
typedef boost::共享的_ptr映像;
旋转图像(常量下一步和下一步):图像装饰器(下一步){
}   
RotateImage():ImageDecorator(){
}
//设置角度函数。。。。
私人:
无效运行()
{
//旋转图像
// ...
next();
}
};
类ResizeImage:PublicImageDecorator
{
公众:
typedef boost::共享的_ptr映像;
调整图像大小(const NextStep&NextStep):图像装饰器(NextStep){
}   
ResizeImage():ImageDecorator(){
}
//设置大小函数。。。。
私人:
无效运行()
{
//调整图像大小
next();
}
};
类SaveImage:公共ImageDecorator
{
公众:
typedef boost::共享的_ptr映像;
保存图像(const NextStep&NextStep):图像装饰器(NextStep){
}   
SaveImage():ImageDecorator(){
}
//设置文件名函数。。。。
私人:
无效运行()
{
//保存图像
next();
}
};
//保存图像
SaveImage*const saver(新的SaveImage());
saver->setImage(/*使用共享指针*/);
saver->setFilename(…);
QThreadPool::globalInstance()->启动(saver);
//旋转并保存图像
const ImageDecorator::NextStep saver(new SaveImage());
saver->setImage(/*使用共享指针*/);
saver->setFilename(…);
RotateImage*常量rotateAndSave(新的RotateImage(saver));
rotateAndSave->setImage(/*使用共享指针*/);
旋转存储->设置角度(…);
QThreadPool::globalInstance()->start(rotateAndSave);
//调整旋转大小并保存图像
const ImageDecorator::NextStep saver(new SaveImage());
saver->setImage(/*使用共享指针*/);
saver->setFilename(…);
const ImageDecorator::NextStep rotateAndSave(新的RotateImage(saver));
rotateAndSave->setImage(/*使用共享指针*/);
旋转存储->设置角度(…);
ResizeImage*常量ResizeZerotate和Save(新的ResizeImage(rotateAndSave));
resizeRotateAndSave->setImage(/*使用共享指针*/);
重新设置零状态并保存->设置大小(…);
QThreadPool::globalInstance()->start(resizeRotateAndSave);

使用
QThread
创建单独的线程,或者使用
QRunnable
的线程池工作线程,或者查看高级QtConcurrent类。是图像缩放的一个示例。

最简单的方法是使用QtConcurrent::run

那么您是否建议深入学习基础知识?线程是正确的答案,Qt的线程支持非常好。如果是我,我会以身作则。链接的应用程序与此类似,它在后台和