Russian Qt Forum
Сентябрь 28, 2024, 20:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Как запустить в Qt новый процесс (или поток) в виде функции?  (Прочитано 22350 раз)
a_n_y_a
Гость
« Ответ #15 : Август 10, 2009, 08:19 »

А функция сигнал реализуется самой библиотекой?! Я думал, что я сам ее должен реализовывать. Так?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #16 : Август 10, 2009, 08:26 »

Сигнал - чисто виртуальная функция (для програмиста), т.е. объявление без реализации. (Реализацией занимается moc - мета-объектный компилятор)
Записан

Юра.
a_n_y_a
Гость
« Ответ #17 : Август 10, 2009, 10:14 »

А какое должно быть соотношение параметров сигнала и слота? Параметры должны совпадать? Или возможно несовпадение?
Записан
uriel
Гость
« Ответ #18 : Август 10, 2009, 10:58 »

Первые параметры сигнала должны совпадать с параметрами слота.
Например, может быть так:
Сигнал: (QString, QString) -> Слот: ()
() -> (int = 0)
(int, QString) -> (int)
А так быть не может:
()- > (int)
(QString) -> (int)
(QString, int) -> (int = 0)
P.S. Если где-то ошибся, поправьте, пожалуйста.
Записан
a_n_y_a
Гость
« Ответ #19 : Август 11, 2009, 09:03 »

Есть такой код:
   Pt=new PotokThread((QObject*)this);
   QObject::connect(ui.MyRun, SIGNAL(clicked()),this, SLOT(ZapuskThread()));
Вопрос: когда поток закрыт по quit();, то Pt еще имеет смысл, или уже удаляется из памяти?

И можно ли по ходу программы создавать потоки и конекты с ними, а потом удалять конекты и потоки?
Записан
spectre71
Гость
« Ответ #20 : Август 11, 2009, 10:41 »

Есть такой код:
   Pt=new PotokThread((QObject*)this);
   QObject::connect(ui.MyRun, SIGNAL(clicked()),this, SLOT(ZapuskThread()));
Вопрос: когда поток закрыт по quit();, то Pt еще имеет смысл, или уже удаляется из памяти?

И можно ли по ходу программы создавать потоки и конекты с ними, а потом удалять конекты и потоки?
1) Если сделать так
Код
C++ (Qt)
 Thread = new MyThread;
 connect(Thread , SIGNAL(finished()), Thread , SLOT(deleteLater()));
 Thread->start();
То, объект Thread удалиться сам по завершению потока.
Соответственно, после Thread->start() использовать объект Thread в главном потоке нельзя, поскольку неизвестно когда поток завершиться и объект Thread будет удален из памяти.

2)  Если сделать так
Код
C++ (Qt)
 Thread = new MyThread;
 connect(Thread , SIGNAL(finished()), MyWidget , SLOT(myThreadFinishedSlot()));
 Thread->start();
То, необходимо отследить момент завершения потока(SIGNAL(finished())) и самостоятельно удалить объект Thread.
Соответственно,  можно  использовать объект Thread в главном потоке до его самостоятельного удаления.
myThreadFinishedSlot - слот у MyWidget который необходимо определить чтобы отследить момент завершения потока.
Записан
a_n_y_a
Гость
« Ответ #21 : Август 12, 2009, 09:43 »


Что то у меня работает, но не так. Есть:

Potok::Potok(QWidget *parent)
    : QWidget(parent)
{
   ui.setupUi(this);
   Pt=new PotokThread((QObject*)this);
   QObject::connect(ui.MyRun, SIGNAL(clicked()),this, SLOT(ZapuskThread()));
   connect(Pt , SIGNAL(finished()), Pt , SLOT(deleteLater()));
   QObject::connect(Pt, SIGNAL(valueChanged(int)), ui.Zapolnenie, SLOT(setValue(int)), Qt::QueuedConnection);
};

  Нажимаю на кнопку MyRun, начинается отсчет времени и отображение этого процесса на прогрессбаре ui.Zapolnenie,
по окончанию цикла, Pt не удаляется, но если я нажимаю на MyRun еще раз (после завершения цикла), то завершается вся программа без какого либо сообщения. Вопрос, почему?
Записан
spectre71
Гость
« Ответ #22 : Август 12, 2009, 10:33 »


Что то у меня работает, но не так. Есть:

Potok::Potok(QWidget *parent)
    : QWidget(parent)
{
   ui.setupUi(this);
   Pt=new PotokThread((QObject*)this);
   QObject::connect(ui.MyRun, SIGNAL(clicked()),this, SLOT(ZapuskThread()));
   connect(Pt , SIGNAL(finished()), Pt , SLOT(deleteLater()));
   QObject::connect(Pt, SIGNAL(valueChanged(int)), ui.Zapolnenie, SLOT(setValue(int)), Qt::QueuedConnection);
};

  Нажимаю на кнопку MyRun, начинается отсчет времени и отображение этого процесса на прогрессбаре ui.Zapolnenie,
по окончанию цикла, Pt не удаляется, но если я нажимаю на MyRun еще раз (после завершения цикла), то завершается вся программа без какого либо сообщения. Вопрос, почему?

Pt=new PotokThread((QObject*)this); - создается  только 1 раз - в конструкторе! На deleteLater - объект Pt уничтожается. После уничтожения Pt - вызов Pt->start() приводит к ошибке!
Делать надо так:
Код
C++ (Qt)
Potok::Potok(QWidget *parent)
   : QWidget(parent)
{
ui.setupUi(this);
QObject::connect(ui.MyRun, SIGNAL(clicked()),this, SLOT(ZapuskThread()));
};
 
void Potok::ZapuskThread (void) {
Pt=new PotokThread((QObject*)this);
connect(Pt , SIGNAL(finished()), Pt , SLOT(deleteLater()));
QObject::connect(Pt, SIGNAL(valueChanged(int)), ui.Zapolnenie, SLOT(setValue(int)), Qt::QueuedConnection);
       Pt->start();
}
 
Записан
a_n_y_a
Гость
« Ответ #23 : Август 12, 2009, 12:28 »

Да, действительно в Pt дело! А почему мне не было выдано сообщение об ошибке указателя? Программа просто завершалась. Я работаю в Eclipse, может в ней дело?
Записан
a_n_y_a
Гость
« Ответ #24 : Август 13, 2009, 08:57 »

Запускаю поток, идет отсчет времени и отображение процесса в прогрессбаре.
Жму крестик - завершение программы, мне выдается сообщение:
QThread: Destroyed while thread is still running
Так и должно быть? Или надо как то обрабатывать поток и завершать его?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #25 : Август 14, 2009, 11:45 »

Так и должно быть? Или надо как то обрабатывать поток и завершать его?

Такого недолжно быть. Нужно корректно завершать работу потока(ов).

Покажи код деструктора потока.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
a_n_y_a
Гость
« Ответ #26 : Август 14, 2009, 12:40 »

В потоке деструктор пустой, ничего не делает.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #27 : Август 14, 2009, 13:58 »

Покажи тогда метод run()
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
a_n_y_a
Гость
« Ответ #28 : Август 17, 2009, 09:01 »

Покажи тогда метод run()

Вот:
PotokThread::~PotokThread()
{
   // TODO Auto-generated destructor stub
};

void PotokThread::run()
{
   // TODO Auto-generated destructor stub
   int i;
   for(i=100;i>=0;i--)
   {
      msleep(100);
      emit valueChanged(i);
   };
};
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #29 : Август 17, 2009, 10:36 »

Попробуй например так:

Код
C++ (Qt)
class PotokThread : public QThread
{
   Q_OBJECT
....
public slots:
   void exitThread();
 
private:
   QMutex m_stopMutex;
   bool m_stopped;
};
 
 
 
PotokThread::~PotokThread()
{
exitThread();
};
 
void PotokThread::exitThread()
{
if (!isRunning())
return;
m_stopMutex.lock();
       m_stopped = true;
       m_stopMutex.unlock();
wait();
}
 
void PotokThread::run()
{
   m_stopMutex.lock();
   m_stopped = false;
   m_stopMutex.unlock();
 
  for(int i=100;i>=0 && !m_stopped;--i)
  {
     msleep(100);
     emit valueChanged(i);
  };
};
« Последнее редактирование: Август 17, 2009, 10:40 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.2 секунд. Запросов: 23.