Проблема слота Qt Thread Signal

Мой threadcheck.h

        #include <QThread>
        #include <QDebug>
        #include <QMutex>
        class ThreadCheck : public QThread
        {
            Q_OBJECT
        public:
            explicit ThreadCheck(QObject *parent = 0);
            int Val() const;

        signals:
            void signalReceived();

        protected:
            void run();
        public slots:
            void slotReceived();
        private:
            QMutex mutex;
            int num;

        };

Мой файл threadcheck.cpp

         #include "threadcheck.h"
        ThreadCheck::ThreadCheck(QObject *parent) :
            QThread(parent)
        {
            connect(this,SIGNAL(signalReceived()),this,SLOT(slotReceived()));
            num = 0;
        }

        int ThreadCheck::Val() const
        {
            return num;
        }


        void ThreadCheck::slotReceived()
        {
            mutex.lock();
            qDebug() << "hello";
            mutex.unlock();
        }


        void ThreadCheck::run()
        {
            while(1)
            {
                emit signalReceived();
            }

        }   

основной .cpp - это

        #include <QCoreApplication>
        #include "threadcheck.h"
        int main(int argc, char *argv[])
        {
            QCoreApplication a(argc, argv);
            ThreadCheck threadCheck;
            threadCheck.start();
            while(1);
            return a.exec();
        }   

Когда я запускаю этот поток из основного, он не показывает, что ни один выходной слот никогда не выполняется. В идеале он должен продолжать печатать привет.

Пожалуйста, предложите решение.


person sanjay    schedule 13.11.2012    source источник
comment
В вашем сообщении недостаточно информации, чтобы ответить на него. У вас есть ошибки, сигналы подключены к слоту?   -  person Matti Lyra    schedule 13.11.2012
comment
нет нет никаких ошибок. но это не как привет вообще.   -  person sanjay    schedule 13.11.2012
comment
отредактируйте этот пост и добавьте точную строку, используемую для подключения сигнала к слоту, и проверьте возвращаемое значение connect. Убедитесь, что это не false   -  person UmNyobe    schedule 13.11.2012
comment
connect () возвращает истину, когда я подключил их в основном   -  person sanjay    schedule 13.11.2012
comment
использование мьютекса бесполезно, если вы блокируете и разблокируете только run() и слоты, которые вызываются только с сигналами, потому что они никогда не будут выполняться одновременно.   -  person UmNyobe    schedule 13.11.2012
comment
На самом деле я буду делать много других вещей на ходу. Я буду получать данные через последовательный порт, поэтому мне нужно заблокировать мьютекс. Это всего лишь пример воспроизведения проблемы.   -  person sanjay    schedule 13.11.2012


Ответы (2)


Удалите while (1) из основной функции.

person Andreas Fester    schedule 13.11.2012

Без особого шума, подклассы QThreads и перезапись метода run () больше не являются способом работы с потоками в Qt.

Прочтите этот блог. Это избавило меня от многих часов головной боли. Неясно, когда произошло это изменение, но пример кода в этом посте теперь находится в официальной документации Qt 5.x.

person Dissident penguin    schedule 13.12.2013