Publicado em Exemplos Qt, Programação, Qt

Manter uma aplicação a responder durante a execução de tarefas demoradas com recurso a threads (C++\Qt)

Com este pequeno exemplo pretendo demonstrar uma forma de manter uma aplicação em funcionamento enquanto são executadas operações demoradas em background.

Para o efeito, simulo a criação de um ficheiro de texto que demora cerca de 15 segundos a ser criado.

Durantante este período, continuamos a ter acesso a todas as opções do menu, não ficando as restantes funcionalidades da aplicação bloqueadas.

Nestas circunstâncias é recomendável associar a tarefa a uma thread, cujo código passo a apresentar.

mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include
#include
#include
#include

class myThread : public QThread
{
    Q_OBJECT
public:
    myThread();
    myThread(QString, int, int);
    void setup(QString, int, int);
    void run();

private:
    QString filename;
    int min;
    int max;
};

#endif // MYTHREAD_H

mythread.cpp

#include "mythread.h"
#include

myThread::myThread()
{
    filename = "default.txt";
    min = 0;
    max = 9;
}

myThread::myThread(QString newFilename, int newMin, int newMax)
{
    filename = newFilename;
    min = newMin;
    max = newMax;
}

void myThread::run()
{
    int rnd;
    QFile name(filename);
    std::cout << "Started writing " <<std::endl;
    if (name.open(QFile::WriteOnly))
    {
            QTextStream ficheiro_de_texto(&name);
            for(int i=0; i<15; i++)
            {
                QThread::sleep(1);
                rnd = min + rand() % (max - min + 1);
                ficheiro_de_texto << QString::number(rnd);
                std::cout << ". " << std::endl;
            }
            name.close();
    }
    std::cout << "Writing stoped." <<std::endl;

}

void myThread::setup(QString newFilename, int newMin, int newMax)
{
    filename = newFilename;
    min = newMin;
    max = newMax;
}

Criei alguns construtores alternativos para esta classe que utiliza três dados para ser executada:

  1. nome do ficheiro de texto a criar;
  2. limite inferior do intervalo de números a gerar;
  3. limite superior do intervalo de números a gerar;

Quando é executado o método run(), é gerado um número aleatório por segundo, com a intenção de tornar o processo demorado.

No final os números ficam armazenados num ficheiro de texto, cujo nome foi indicado pelo utilizador.
Por questões de simplificação do código, tentei fazer o mínimo de validações de inputs, pelo recomendo algum cuidado ao testar a aplicação.

O código fonte do exemplo pode ser consultado aqui.

Anúncios

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s