Создание QDialog из дочернего потока
От: Iya  
Дата: 28.04.13 18:26
Оценка:
Необходимо из потока типа QThread вызвать диалог QDialog с кнопкой, при вызове которого необходимо приостановить работу этого же потока, а после нажатии на кнопку закрыть диалог и возобновить работу потока. Проще говоря, реализовать вызов метода Пауза для рабочего потока.
Очень нужна помощь. Окончательно запуталась, когда и из какого потока (GUI или дочернего) вызываются сигналы и слоты.
Спасибо.
Re: Создание QDialog из дочернего потока
От: SaZ  
Дата: 28.04.13 20:33
Оценка:
Здравствуйте, Iya, Вы писали:

Iya>Необходимо из потока типа QThread вызвать диалог QDialog с кнопкой, при вызове которого необходимо приостановить работу этого же потока, а после нажатии на кнопку закрыть диалог и возобновить работу потока. Проще говоря, реализовать вызов метода Пауза для рабочего потока.

Iya>Очень нужна помощь. Окончательно запуталась, когда и из какого потока (GUI или дочернего) вызываются сигналы и слоты.
Iya>Спасибо.

В GUI потоке делаете слот, который показывает ваш диалог.
В рабочем потоке объявляете сигнал.
Соединяете сигнал и слот с типом соединения Qt::BlockingQueuedConnection
В рабочем потоке делаете emit ваш сигнал
Всё.
Re[2]: Создание QDialog из дочернего потока
От: _niko_ Россия  
Дата: 28.04.13 21:51
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>Здравствуйте, Iya, Вы писали:


Iya>>Необходимо из потока типа QThread вызвать диалог QDialog с кнопкой, при вызове которого необходимо приостановить работу этого же потока, а после нажатии на кнопку закрыть диалог и возобновить работу потока. Проще говоря, реализовать вызов метода Пауза для рабочего потока.

Iya>>Очень нужна помощь. Окончательно запуталась, когда и из какого потока (GUI или дочернего) вызываются сигналы и слоты.
Iya>>Спасибо.

SaZ>В GUI потоке делаете слот, который показывает ваш диалог.

SaZ>В рабочем потоке объявляете сигнал.
SaZ>Соединяете сигнал и слот с типом соединения Qt::BlockingQueuedConnection
SaZ>В рабочем потоке делаете emit ваш сигнал
SaZ>Всё.

. . . а ожидание закрытия диалога реализовать через QEventLoop, где соединение сигнала диалога со слотом QEventLoop::quit соединить с тем же типом Qt::BlockingQueuedConnection.
Re[3]: Создание QDialog из дочернего потока
От: SaZ  
Дата: 29.04.13 07:22
Оценка:
Здравствуйте, _niko_, Вы писали:

__>. . . а ожидание закрытия диалога реализовать через QEventLoop, где соединение сигнала диалога со слотом QEventLoop::quit соединить с тем же типом Qt::BlockingQueuedConnection.


Может я чего-то не знаю, но в описанном случае emit будет "ожидать" завершения работы всех слотов. Разве нет? (Это если QDialog показывать через вызов .exec() то всё должно быть хорошо.)
Re[4]: Создание QDialog из дочернего потока
От: _niko_ Россия  
Дата: 29.04.13 07:33
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>Здравствуйте, _niko_, Вы писали:


__>>. . . а ожидание закрытия диалога реализовать через QEventLoop, где соединение сигнала диалога со слотом QEventLoop::quit соединить с тем же типом Qt::BlockingQueuedConnection.


SaZ>Может я чего-то не знаю, но в описанном случае emit будет "ожидать" завершения работы всех слотов. Разве нет? (Это если QDialog показывать через вызов .exec() то всё должно быть хорошо.)


В качестве отмазки можно сказать что я имел ввиду отображение даилога по .show(), но нет — все же накосячил.

Я в типе соединения по Qt::BlockingQueuedConnection почему то увидел Qt::QueuedConnection
Re[2]: Создание QDialog из дочернего потока
От: Iya  
Дата: 29.04.13 16:24
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>Здравствуйте, Iya, Вы писали:


Iya>>Необходимо из потока типа QThread вызвать диалог QDialog с кнопкой, при вызове которого необходимо приостановить работу этого же потока, а после нажатии на кнопку закрыть диалог и возобновить работу потока. Проще говоря, реализовать вызов метода Пауза для рабочего потока.

Iya>>Очень нужна помощь. Окончательно запуталась, когда и из какого потока (GUI или дочернего) вызываются сигналы и слоты.
Iya>>Спасибо.

SaZ>В GUI потоке делаете слот, который показывает ваш диалог.

SaZ>В рабочем потоке объявляете сигнал.
SaZ>Соединяете сигнал и слот с типом соединения Qt::BlockingQueuedConnection
SaZ>В рабочем потоке делаете emit ваш сигнал
SaZ>Всё.
Re[2]: Создание QDialog из дочернего потока
От: Iya  
Дата: 29.04.13 16:33
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>В GUI потоке делаете слот, который показывает ваш диалог.

SaZ>В рабочем потоке объявляете сигнал.
SaZ>Соединяете сигнал и слот с типом соединения Qt::BlockingQueuedConnection
SaZ>В рабочем потоке делаете emit ваш сигнал
SaZ>Всё.
Очень благодарна Вам за помощь!
Я попробовала сделать так, Вы мне посоветовали, но диалог выводится, а поток не останавливается.
Вот как я это сделала:

//    file QDialogs.h
//---------------------------------------------------------------
class createDialogs: public QObject
{
    Q_OBJECT

public:
    createDialogs(QObject *parent = 0) 
    {};

public slots:
   void createPause(void);
};


class QPause : public QDialog 
{
// Q_OBJECT     

public:
    QPause (QWidget* parent = 0);
};



//---------------------------------------------------------------
//    file QDialogs.cpp
//---------------------------------------------------------------

QPause::QPause(QWidget *parent): QDialog(parent)
{
  QPushButton *pauseButton = new QPushButton(tr("Пауза"));
  //pauseButton->setGeometry(20,20,100,100);
  connect(pauseButton, SIGNAL(clicked()), this, SLOT(close()));    
  QHBoxLayout *layout1 = new QHBoxLayout;
  layout1 -> addWidget(pauseButton);
  setLayout(layout1);
}




void createDialogs::createPause(void)
{

    QPause *ShowPause = new QPause();
    QObject::connect(ShowPause, SIGNAL(finished(int)), ShowPause, SLOT(deleteLater()));
    QEventLoop loop;
    QObject::connect(ShowPause, SIGNAL(finished(int)), &loop, SLOT(quit())/*, Qt::QueuedConnection*/);
    ShowPause->show();
    loop.exec();

}

//---------------------------------------------------------------
// в главной форме, где
// TThQMProgram: public QThread, в конструкторе которой указывается функция, которая будет запущена в run
//
//---------------------------------------------------------------

createDialogs* dialogs = new createDialogs();
    program = new TThQMProgram(qm_main_proc);
    QObject::connect(program, SIGNAL(finished()), program, SLOT(deleteLater()));
    QObject::connect(program, SIGNAL(paused()), dialogs, SLOT(createPause())/*, Qt::QueuedConnection*/);
    program ->start();     
    
    
    

void qm_main_proc(void)
{
    int i;
    double k;
    for (i=1; i<=10; i++)
    {
      k = k + i*10;
      qDebug() << i;

      if (i == 5 )
      {    
         program->callPause();
      }

    }    
    
    
//---------------------------------------------------------------    
//    выборочно из file TThQMProgram_file.cpp    
//---------------------------------------------------------------
    
void TThQMProgram::callPause(void)
{
    emit paused();
}


Посмотрите, пожалуйста, что я не так сделала. К тому же хочу заметить, что qm_main_proc может содержать любой код, в том числе и без циклов. Моя задача заключается в том, чтобы внутри данной процедуры вставить одну строчку вызова паузы (в дальнейшем и другие методы, типа слип, ввод данных, чтение данных, реализованные аналогично паузе).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.