Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: QT выполнение метода класса в новом потоке.  (Прочитано 12280 раз)
0 Пользователей и 1 Гость смотрят эту тему.
sd
Постоялец

by
Offline Offline

« : 08-04-2014 11:35 » 

Доброго времени суток. Вопрос может показаться простым\глупым\странным (нужное подчеркнуть), но я, прочитав несколько статей по поводу QThread, так и не совсем понял ответ на него.
Ситуация такая: есть главный поток - UI, у него есть объект класса cpu. В cpu настраиваются регистры, флаги, вбивается программа в память и потом она выполняется. Так вот, надо сделать, чтоб она (программа из памяти cpu) выполнялась в отдельном потоке, чтоб была возможность работать с UI (на случай, если в cpu программа с бесконечным циклом). При этом при все, при завершении выполнения программы из cpu, объект cpu не должен уничтожаться. Он должен ждать пока в него введут новую программу и запустят.
Так вот вопрос в чем: достаточно ли для этого будет просто унаследовать класс cpu от QThread и метод run() перегрузить таким образом, чтоб в нем выполнялась программа, введенная в память процессора? При завершении программы (из памяти процессора) просто убивается процесс ее выполнения, а при повторном запуске программы он снова должен создаваться.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 08-04-2014 15:03 » new

Пример из мануала думаю достаточен.
Код: (C++)
class Worker : public QObject
 {
     Q_OBJECT

 public slots:
     void doWork() {
         ...
     }
 };

 void MyObject::putWorkerInAThread()
 {
     Worker *worker = new Worker;
     QThread *workerThread = new QThread(this);

     connect(workerThread, SIGNAL(started()), worker, SLOT(doWork()));
     connect(workerThread, SIGNAL(finished()), worker, SLOT(deleteLater()));
     worker->moveToThread(workerThread);

     // Starts an event loop, and emits workerThread->started()
     workerThread->start();
 }
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
sd
Постоялец

by
Offline Offline

« Ответ #2 : 08-04-2014 16:08 » 

Вроде все понятно, но хотелось бы уточнить некоторые моменты:
1) класс Worker, в моем случае, будет мой класс cpu, клас MyObject - класс с GUI?
2) Метод doWork будет выполнять программу пользователя, putWorkerInAThread будет выполняться, когда с GUI запускаем программу?
3) Я могу создать объект класса Worker в конструкторе класса MyObject и там назначить все связи между сигналами и слотами?
4) Если я создам объект workerThread  в функции putWorkerInAThread, выполню программу пользователя, а затем удаляю объект workerThread, это никак не повлияет на мой объект класса Worker, созданного как в п.3?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 09-04-2014 15:07 » 

1) Не обязательно, Хоть в main  можеш так сделать. Там ты просто иницилизируеш нить.
2) В doWork содержиться код нити (потока). Остальное ответ в пункте 1.
3) Смотри пункт 1.
4) Скорее всего повлияет.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines