Необходимо из потока типа QThread вызвать диалог QDialog с кнопкой, при вызове которого необходимо приостановить работу этого же потока, а после нажатии на кнопку закрыть диалог и возобновить работу потока. Проще говоря, реализовать вызов метода Пауза для рабочего потока.
Очень нужна помощь. Окончательно запуталась, когда и из какого потока (GUI или дочернего) вызываются сигналы и слоты.
Спасибо.
Здравствуйте, Iya, Вы писали:
Iya>Необходимо из потока типа QThread вызвать диалог QDialog с кнопкой, при вызове которого необходимо приостановить работу этого же потока, а после нажатии на кнопку закрыть диалог и возобновить работу потока. Проще говоря, реализовать вызов метода Пауза для рабочего потока. Iya>Очень нужна помощь. Окончательно запуталась, когда и из какого потока (GUI или дочернего) вызываются сигналы и слоты. Iya>Спасибо.
В GUI потоке делаете слот, который показывает ваш диалог.
В рабочем потоке объявляете сигнал.
Соединяете сигнал и слот с типом соединения Qt::BlockingQueuedConnection
В рабочем потоке делаете emit ваш сигнал
Всё.
Здравствуйте, SaZ, Вы писали:
SaZ>Здравствуйте, Iya, Вы писали:
Iya>>Необходимо из потока типа QThread вызвать диалог QDialog с кнопкой, при вызове которого необходимо приостановить работу этого же потока, а после нажатии на кнопку закрыть диалог и возобновить работу потока. Проще говоря, реализовать вызов метода Пауза для рабочего потока. Iya>>Очень нужна помощь. Окончательно запуталась, когда и из какого потока (GUI или дочернего) вызываются сигналы и слоты. Iya>>Спасибо.
SaZ>В GUI потоке делаете слот, который показывает ваш диалог. SaZ>В рабочем потоке объявляете сигнал. SaZ>Соединяете сигнал и слот с типом соединения Qt::BlockingQueuedConnection SaZ>В рабочем потоке делаете emit ваш сигнал SaZ>Всё.
. . . а ожидание закрытия диалога реализовать через QEventLoop, где соединение сигнала диалога со слотом QEventLoop::quit соединить с тем же типом Qt::BlockingQueuedConnection.
Здравствуйте, _niko_, Вы писали:
__>. . . а ожидание закрытия диалога реализовать через QEventLoop, где соединение сигнала диалога со слотом QEventLoop::quit соединить с тем же типом Qt::BlockingQueuedConnection.
Может я чего-то не знаю, но в описанном случае emit будет "ожидать" завершения работы всех слотов. Разве нет? (Это если QDialog показывать через вызов .exec() то всё должно быть хорошо.)
Здравствуйте, SaZ, Вы писали:
SaZ>Здравствуйте, _niko_, Вы писали:
__>>. . . а ожидание закрытия диалога реализовать через QEventLoop, где соединение сигнала диалога со слотом QEventLoop::quit соединить с тем же типом Qt::BlockingQueuedConnection.
SaZ>Может я чего-то не знаю, но в описанном случае emit будет "ожидать" завершения работы всех слотов. Разве нет? (Это если QDialog показывать через вызов .exec() то всё должно быть хорошо.)
В качестве отмазки можно сказать что я имел ввиду отображение даилога по .show(), но нет — все же накосячил.
Я в типе соединения по Qt::BlockingQueuedConnection почему то увидел Qt::QueuedConnection
Здравствуйте, SaZ, Вы писали:
SaZ>Здравствуйте, Iya, Вы писали:
Iya>>Необходимо из потока типа QThread вызвать диалог QDialog с кнопкой, при вызове которого необходимо приостановить работу этого же потока, а после нажатии на кнопку закрыть диалог и возобновить работу потока. Проще говоря, реализовать вызов метода Пауза для рабочего потока. Iya>>Очень нужна помощь. Окончательно запуталась, когда и из какого потока (GUI или дочернего) вызываются сигналы и слоты. Iya>>Спасибо.
SaZ>В GUI потоке делаете слот, который показывает ваш диалог. SaZ>В рабочем потоке объявляете сигнал. SaZ>Соединяете сигнал и слот с типом соединения Qt::BlockingQueuedConnection SaZ>В рабочем потоке делаете emit ваш сигнал SaZ>Всё.
Здравствуйте, 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 может содержать любой код, в том числе и без циклов. Моя задача заключается в том, чтобы внутри данной процедуры вставить одну строчку вызова паузы (в дальнейшем и другие методы, типа слип, ввод данных, чтение данных, реализованные аналогично паузе).