Выполнение отдельного процесса или потока в QT

Если установлен Quartz, все, что нужно, это добавить строку «X11Trusted yes» в поле «Host *» в файле / etc / ssh / ssh_config.

8
задан Skilldrick 28 May 2009 в 22:10
поделиться

3 ответа

Qt поддерживает потоки. этот пример приложения может показаться вам интересным, поскольку он несколько похож на то, что вы описываете.

Кроме того, это полная документация по потоку Qt .

14
ответ дан 5 December 2019 в 08:00
поделиться

Отредактировано

Извините, ребята, мне очень трудно связать «Пример настраиваемого типа в очереди» с требованиями.

Насколько я могу судить из вопроса, однажды Пользователь принял или отклонил изображение, оно должно быть необязательно повернуто и / или масштабировано и всегда сохранено в определенном каталоге и переходить к следующему изображению. (-> больше нет взаимодействия с пользователем)
Даже если пользователь выходит из текущего диалогового окна, изображение все равно необходимо сохранить.

«Пример пользовательского типа в очереди» обрабатывает только одно изображение, всегда связано с графическим интерфейсом и когда пользователи выходят из диалогового окна, операция потока останавливается.
Поэтому, если он запустит свою программу из примера Queued, он, вероятно, начнет писать очередь изображений, защищенных мьютексом, чтобы он мог добавлять новые изображения в список, если есть ожидающие операции сохранения. В противном случае пользователю все равно придется ждать ожидающих операций.
Вторая проблема заключается в том, что он, вероятно, не хочет ждать ожидающих операций сохранения при закрытии диалогового окна.

Что бы я сделал, чтобы удовлетворить требования, так это работа с пулом потоков. Подайте в пул потоков нужные операции сохранения и используйте шаблон декоратора на основе QRunnable, если его также нужно повернуть / масштабировать. Все очереди обрабатываются библиотекой правильно, и ожидающие операции выполняются, даже если пользователь выходит из текущего диалогового окна. В конце я, возможно, использовал бы пример кода в очереди, чтобы загрузить новые изображения и дать пользователю указание на ожидание операции загрузки.

Мои runnables и декоратор, вероятно, будут выглядеть так ... (возможно, некоторые дополнительные конструкторы для замены установленных функций), поэтому я могу очень легко добавить новую операцию, подобную этой 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 );
2
ответ дан 5 December 2019 в 08:00
поделиться

такого рода задачи идеально подходят для потоков. тем не менее, вы должны сначала выполнить «обычную» функцию, которая это делает, а когда она сработает, добавьте поток, который читает очередь и вызывает ту же функцию обработки.

Qt имеет множество инструментов, которые помогут вам в этом, в основном, тот факт, что большинство контейнеров являются потокобезопасными, а также парочка потоковых алгоритмов (например, map-reduce). тем не менее, сначала попробуйте синхронно.

3
ответ дан 5 December 2019 в 08:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: