Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: agm от Ноябрь 26, 2010, 17:06



Название: Соединение сигналов и слотов между потоками
Отправлено: agm от Ноябрь 26, 2010, 17:06
Есть простая форма отнаследованная от QWidget. В ней по нажатию кнопки запускаем некий набор действий (операции с файлами). Все эти действия реализованы в классе отнаследованном QThread.
Поток запускаем из формы.
в констркуторе формы соединяю ее с потоком так:
connect(&proc, SIGNAL(sign(int)),SLOT(t(int)));
в итоге такая ошибка:
error: expected primary-expression before ',' token
в чем может быть проблемма?


Название: Re: Соединение сигналов и слотов между потоками
Отправлено: RedDog от Ноябрь 26, 2010, 17:19
Посылатель сигнала есть в connect, а получателя нету.
Код:
connect(&proc, SIGNAL(sign(int)) /*вот тут*/,SLOT(t(int)));


Название: Re: Соединение сигналов и слотов между потоками
Отправлено: agm от Ноябрь 26, 2010, 17:27
пробовал так
connect(&proc, SIGNAL(sign(int)), this ,SLOT(t(int)));
тоже самое


Название: Re: Соединение сигналов и слотов между потоками
Отправлено: RedDog от Ноябрь 26, 2010, 18:10
весь код покажи


Название: Re: Соединение сигналов и слотов между потоками
Отправлено: agm от Ноябрь 29, 2010, 11:13
Пишу подробнее, вот класс формы
Код:
class FileFinder : public QWidget {
    Q_OBJECT
private:
    QLineEdit* m_ptxtDir;
    QLineEdit* m_ptxtMask;
    QTextEdit* m_ptxtResult;
    QLCDNumber* lcd;
    QString pathR;
    QFile file;
    QString name_of_dir;
    QString name_new;
    QDir dir;
    proc thread; //  создаем объект класса потока
public:
    FileFinder(QWidget* pwgt = 0);   
    void start(const QDir& dir);
    void runF(const QDir& dir);   
public slots:
    void slotFind  ();
    void slotBrowse();
    void t(int);   // слот который будем моединять с потоком
};

в конструкторе формы соединяем сигнал из потока со слотом в форме
Код:
  connect(&proc, SIGNAL(sign(int)),this,SLOT(t(int)));
длее зглушка слота, и запускаем поток по нажатию кнопки
Код:
void FileFinder::t(int w)
{
}
// ----------------------------------------------------------------------
void FileFinder::slotFind()
{
    dir = QDir(m_ptxtDir->text());
    QStringList listFiles = dir.entryList(m_ptxtMask->text().split(" "), QDir::Files);   
      thread.setProc(listFiles, m_ptxtDir->text());
    thread.start();
}

класс потока
Код:
class proc : public QThread
{
Q_OBJECT
private:   
    int m_nValue;
public:
    explicit proc(QObject *p2=0);
    void setProc(QStringList, QString);
    void run();

signals:
     void sign(int); // сигнал из потока
};

сигнал sign(int) вызываем в методе run как emit sign(j);

Возможно то, что я хочу  делается совсем не так?
Похожего примера не нашел пока, может кто ссылку даст.


Название: Re: Соединение сигналов и слотов между потоками
Отправлено: Авварон от Ноябрь 29, 2010, 11:45
Ну класс потока у вас живет в главном потоке. Ищите по форуму, я задолбался уже выкладывать ту ссылку, как правильно с потоками в Qt работать (кстати надо бы доку им поправить, а то там для старых версий пример)
Чтобы работали сигналы/слоты нужен exec()
added: последний раз выкладываю http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/