реализовать поток для потребления операций в Qt - PullRequest
1 голос
/ 12 октября 2009

Я никогда не работал с QThread в Qt или с потоками в целом, поэтому эта тема для меня более чем нова. Тем не менее, я должен использовать QThread, чтобы избежать блокировки моего основного приложения из-за некоторых сложных вычислений.

Итак, я хочу поместить свои тяжелые вычисления в поток, и если они занимают слишком много времени, я хочу уничтожить поток (что также было мне предложено).

У меня есть следующая декларация для моей темы:

class myopThread : public QThread
{
public:
    void run();
};

void myopThread::run()
   {

std::cout<<"here in the thread. Are you working?"<<endl;
    //include all the consuming operations here
exec();
}

Я также запускаю тему в моем основном приложении:

myopThread *t=new myopThread;
t->start();

Кажется, работает. Тем не менее, теперь я хотел бы убить этот поток всякий раз, когда, скажем, вычислительное время операций в run () превышает 2 минуты.

Я не знаю, как это реализовать. Любая помощь более чем приветствуется.

Заранее спасибо, Madalina

Ответы [ 3 ]

1 голос
/ 12 октября 2009

Попробуйте использовать таймер:

myopThread *t = new myopThread;
QTimer::singleShot(120000, myopThread, SLOT(terminate()));
t->start();

Документ Qt :

void QThread :: terminate () [slot]

Предупреждение: Эта функция опасна и его использование не рекомендуется. Нить может быть прекращено в любой точке его Путь к коду. Потоки могут быть прекращены при изменении данных. Здесь нет шанс для потока, чтобы очистить после сам, разблокировать любые удерживаемые мьютексы и т. д. Короче говоря, используйте эту функцию, только если абсолютно необходимо.

Лучшим решением является создание собственного слота terminateAsSoonAsPossible() в вашем потоке, который устанавливает для переменной shouldTerminate значение true, которую вы можете опрашивать в своем потоке и завершать работу, если она истинна.

1 голос
/ 12 октября 2009

"У программиста Боба есть проблема программирования. Боб решил использовать темы. Теперь у Боба две проблемы ". - Из потока на StackOverflow

Могу ли я предложить вам взглянуть на processEvents (), который поможет вашей программе очень просто реагировать на ОС, без потоков и таймеров? У меня был похожий выбор, и я понял, что это хороший выбор. Это может быть или не быть лучшим для вашего проекта.

ссылка на processEvents

1 голос
/ 12 октября 2009

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

Еще одним преимуществом пула является улучшение длительной операции создания потока. Вместо ожидания нового потока просто используйте существующий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...