Название: Не срабатывает сигнал из потока
Отправлено: vohulg от Декабрь 12, 2013, 07:01
Пытаюсь изменять виджет (прогрессбар) основного потока из второстепенного путем связывания сигнала второстепенного потока с слотом основного потока. Проблема в том что сигнал не срабатывают и данные из сигнала второстепенного потока не передаются в слот основного потока, и вообще слот основного потока не вызывается. В чем может быть ошибка ? Main programm
mainwindow.h
#include <QMainWindow> #include <ttest.h>
using namespace std;
namespace Ui { class ddMainWindow; }
class ddMainWindow : public QMainWindow { Q_OBJECT
public:
explicit ddMainWindow(QWidget *parent = 0);
~ddMainWindow();
private slots: void ShowInfo(int , off_t);
private:
Ui::ddMainWindow *ui; Ttest *test; //point to thread
};
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h"
ddMainWindow::ddMainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::ddMainWindow) { ui->setupUi(this);
test = new Ttest(this); // выделяю память для второстепенного потока QObject::connect(test, SIGNAL(changeVal(int, off_t)), SLOT(ShowInfo(int, off_t)), Qt::QueuedConnection); // связываю сигнал второстепенного потока с слотом главного потока
//connect(test, SIGNAL(changeVal(int, off_t)), this, SLOT(ShowInfo(int, off_t))); // другой код связывания тоже пробовал // connect(test, SIGNAL(changeVal(int, off_t)), SLOT(ShowInfo(int, off_t))); // еще вариант связывания
}
ddMainWindow::~ddMainWindow() { delete ui; }
void ddMainWindow::ShowInfo(int progressVal, off_t time) { ui->progressBar->setValue(progressVal); // слот не вызывается по сигналу второстепенного потока changeVal(int, off_t)
}
void ddMainWindow::on_ddStartButton_clicked() { test->start(); // запуск потока } ---------------------------------------------------------------------------- второстепенный поток
ttest.h
#include <QThread>
class Ttest : public QThread { Q_OBJECT public: explicit Ttest(QObject *parent = 0); void run();
signals:
void changeVal(int, off_t);
public slots:
};
----------------------------------------------
ttest.cpp
#include "ttest.h"
Ttest::Ttest(QObject *parent) : QThread(parent) { }
void Ttest::run() {
int pv = 0; off_t t = 0; for (int x=0; x < 100; x ++) { emit changeVal(pv, t); // вызов сигнала для запуска слота передача значений слоту основного потока pv++; t++; sleep(1);
}
}
Название: Re: Не срабатывает сигнал из потока
Отправлено: Johnik от Декабрь 12, 2013, 07:24
сделали: Q_DECLARE_METATYPE(off_t) и qRegisterMetaType<off_t>() ?
Название: Re: Не срабатывает сигнал из потока
Отправлено: vohulg от Декабрь 12, 2013, 07:51
нет не сделал. Сейчас добавлю
Название: Re: Не срабатывает сигнал из потока
Отправлено: vohulg от Декабрь 12, 2013, 12:15
Добавил, но ситуация не поменялась. Может я не там добавил ?
Q_DECLARE_METATYPE(off_t) добавил в header файл основного приложения, а qRegisterMetaType<off_t>() перед функцией connect.
Название: Re: Не срабатывает сигнал из потока
Отправлено: Johnik от Декабрь 12, 2013, 12:32
QObject::connect() ошибок не возвращает?
может выложить минимальный компилябельный проект?
Название: Re: Не срабатывает сигнал из потока
Отправлено: vohulg от Декабрь 12, 2013, 12:36
Ошибок нет. Вот компилируемый проект Main programm
mainwindow.h
#include <QMainWindow> #include <ttest.h>
using namespace std;
namespace Ui { class ddMainWindow; }
class ddMainWindow : public QMainWindow { Q_OBJECT
public:
explicit ddMainWindow(QWidget *parent = 0);
~ddMainWindow();
private slots: void ShowInfo(int , off_t);
private:
Ui::ddMainWindow *ui; Ttest *test; //point to thread
};
Q_DECLARE_METATYPE(off_t)
______________________________________________________________
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h"
ddMainWindow::ddMainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::ddMainWindow) { ui->setupUi(this);
test = new Ttest(this); qRegisterMetaType<off_t>(); QObject::connect(test, SIGNAL(changeVal(int, off_t)), SLOT(ShowInfo(int, off_t)), Qt::QueuedConnection);
}
ddMainWindow::~ddMainWindow() { delete ui; }
void ddMainWindow::ShowInfo(int progressVal, off_t time) { ui->progressBar->setValue(progressVal);
}
void ddMainWindow::on_ddStartButton_clicked() { test->start(); } ---------------------------------------------------------------------------- potok ttest.h
#include <QThread>
class Ttest : public QThread { Q_OBJECT public: explicit Ttest(QObject *parent = 0); void run();
signals:
void changeVal(int, off_t);
public slots:
};
----------------------------------------------
ttest.cpp
#include "ttest.h"
Ttest::Ttest(QObject *parent) : QThread(parent) { }
void Ttest::run() {
int pv = 0; off_t t = 0; for (int x=0; x < 100; x ++) { emit changeVal(pv, t); pv++; t++; sleep(1);
}
}
Название: Re: Не срабатывает сигнал из потока
Отправлено: Johnik от Декабрь 12, 2013, 13:28
Чтобы его скомпилить и попробовать запустить не хватает как минимум: ddmainwindow.ui main.cpp
где описан off_t?
--- В run() метод есть вхождение? сигнал changeVal испускается? для начала можно попробовать заменить off_t на int или совсем убрать
Название: Re: Не срабатывает сигнал из потока
Отправлено: vohulg от Декабрь 12, 2013, 13:47
без off_t работает. Попробую тогда ей замену найти. Спасибо
Название: Re: Не срабатывает сигнал из потока
Отправлено: Johnik от Декабрь 12, 2013, 13:56
скорее всего дело в том что он не зарегистрирован правильно
будет проще найти причину, если довыложите файлы, чтоб проект можно было скомпилировать
Название: Re: Не срабатывает сигнал из потока
Отправлено: vohulg от Декабрь 12, 2013, 14:48
off_t описан в stdio.h stdio.h я подключил в header файл mainwindow.h main.cpp
#include "ddmainwindow.h" #include <QApplication>
bool StopIndicator;
int main(int argc, char *argv[]) { QApplication a(argc, argv); StopIndicator = false; ddMainWindow w; w.show();
return a.exec(); }
ddmainwindow.dd
<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>ddMainWindow</class> <widget class="QMainWindow" name="ddMainWindow"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>528</width> <height>414</height> </rect> </property> <property name="windowTitle"> <string>ddMainWindow</string> </property> <widget class="QWidget" name="centralWidget"> <widget class="QTableWidget" name="tableWidget"> <property name="geometry"> <rect> <x>10</x> <y>180</y> <width>411</width> <height>171</height> </rect> </property> <property name="rowCount"> <number>3</number> </property> <property name="columnCount"> <number>3</number> </property> <row/> <row/> <row/> <column/> <column/> <column/> </widget> <widget class="QPushButton" name="ddStartButton"> <property name="geometry"> <rect> <x>10</x> <y>70</y> <width>83</width> <height>24</height> </rect> </property> <property name="text"> <string>start </string> </property> </widget> <widget class="QPushButton" name="fillTable"> <property name="geometry"> <rect> <x>430</x> <y>180</y> <width>91</width> <height>24</height> </rect> </property> <property name="text"> <string>Update disks</string> </property> </widget> <widget class="QLineEdit" name="lineEditdest"> <property name="geometry"> <rect> <x>220</x> <y>40</y> <width>191</width> <height>22</height> </rect> </property> </widget> <widget class="QPushButton" name="destDialog"> <property name="geometry"> <rect> <x>410</x> <y>40</y> <width>41</width> <height>22</height> </rect> </property> <property name="text"> <string>D</string> </property> </widget> <widget class="QPushButton" name="ddStopButton"> <property name="geometry"> <rect> <x>100</x> <y>70</y> <width>81</width> <height>22</height> </rect> </property> <property name="text"> <string>Stop</string> </property> </widget> <widget class="QProgressBar" name="progressBar"> <property name="geometry"> <rect> <x>10</x> <y>120</y> <width>481</width> <height>23</height> </rect> </property> <property name="value"> <number>0</number> </property> </widget> <widget class="QComboBox" name="comboBoxSrc"> <property name="geometry"> <rect> <x>10</x> <y>40</y> <width>191</width> <height>22</height> </rect> </property> </widget> <widget class="QLabel" name="labelSrc"> <property name="geometry"> <rect> <x>60</x> <y>20</y> <width>91</width> <height>16</height> </rect> </property> <property name="text"> <string>Disk source</string> </property> </widget> <widget class="QLabel" name="labelDest"> <property name="geometry"> <rect> <x>240</x> <y>20</y> <width>121</width> <height>16</height> </rect> </property> <property name="text"> <string>File Destination</string> </property> </widget> <widget class="QPushButton" name="ExitBut"> <property name="geometry"> <rect> <x>470</x> <y>10</y> <width>51</width> <height>22</height> </rect> </property> <property name="text"> <string>Exit</string> </property> </widget> <widget class="QLabel" name="labelInfo"> <property name="geometry"> <rect> <x>10</x> <y>150</y> <width>481</width> <height>16</height> </rect> </property> <property name="text"> <string>TextLabel</string> </property> </widget> </widget> <widget class="QMenuBar" name="menuBar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>528</width> <height>19</height> </rect> </property> </widget> <widget class="QToolBar" name="mainToolBar"> <attribute name="toolBarArea"> <enum>TopToolBarArea</enum> </attribute> <attribute name="toolBarBreak"> <bool>false</bool> </attribute> </widget> <widget class="QStatusBar" name="statusBar"/> </widget> <layoutdefault spacing="6" margin="11"/> <resources/> <connections> <connection> <sender>destDialog</sender> <signal>clicked()</signal> <receiver>ddMainWindow</receiver> <slot>SaveDestFile()</slot> <hints> <hint type="sourcelabel"> <x>434</x> <y>87</y> </hint> <hint type="destinationlabel"> <x>414</x> <y>111</y> </hint> </hints> </connection> <connection> <sender>ExitBut</sender> <signal>clicked()</signal> <receiver>ddMainWindow</receiver> <slot>ExitApp()</slot> <hints> <hint type="sourcelabel"> <x>496</x> <y>59</y> </hint> <hint type="destinationlabel"> <x>498</x> <y>75</y> </hint> </hints> </connection> <connection> <sender>ddStopButton</sender> <signal>clicked()</signal> <receiver>ddMainWindow</receiver> <slot>ddStop()</slot> <hints> <hint type="sourcelabel"> <x>174</x> <y>114</y> </hint> <hint type="destinationlabel"> <x>199</x> <y>122</y> </hint> </hints> </connection> </connections> <slots> <signal>changeVal(int,off_t)</signal> <slot>slotFillTable()</slot> <slot>SaveDestFile()</slot> <slot>ExitApp()</slot> <slot>ddStop()</slot> <slot>slotChangeVal(int,off_t)</slot> </slots> </ui>
Название: Re: Не срабатывает сигнал из потока
Отправлено: Johnik от Декабрь 13, 2013, 06:21
замените: qRegisterMetaType<off_t>(); на qRegisterMetaType<off_t>("off_t");
должно сработать
|