Я пытался получить этот простой пример, используя для работы потоки, активируемые кнопками. Он основан на решении вопроса ниже:
Как реализовать частый запуск/остановку потока (QThread )а>
Основные различия между приведенным выше примером решения и моим кодом ниже:
- Я использовал QWidget вместо MainWindow
- Я изменил название сигналов для ясности
- Мой код содержит отладочную информацию
- Я экспериментировал с устранением сигналов, созданных работником, поскольку он ничего не делал.
Похоже, что сигналы запуска/остановки не запускают соответствующие слоты, но у меня недостаточно опыта, чтобы решить, почему.
Кроме того, я не уверен в цели сигнала:
SignalToObj_mainThreadGUI()
Это просто то, что можно использовать, а что нет?
Я пытался заставить этот код работать в течение некоторого времени, поэтому любая помощь будет принята с благодарностью.
main.cpp
#include "threadtest.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); ThreadTest w; w.show(); return a.exec(); }
threadtest.h
#include <QWidget> #include <QThread> #include "worker.h" namespace Ui { class ThreadTest; } class ThreadTest : public QWidget { Q_OBJECT public: explicit ThreadTest(QWidget *parent = 0); ~ThreadTest(); signals: void startWorkSignal(); void stopWorkSignal(); private slots: void on_startButton_clicked(); void on_stopButton_clicked(); private: Ui::ThreadTest *ui; worker *myWorker; QThread *WorkerThread; };
threadtest.cpp
#include "threadtest.h" #include "ui_threadtest.h" ThreadTest::ThreadTest(QWidget *parent) : QWidget(parent), ui(new Ui::ThreadTest) { ui->setupUi(this); myWorker = new worker; WorkerThread = new QThread; myWorker->moveToThread(WorkerThread); connect(this, SIGNAL(startWorkSignal()), myWorker, SLOT(StartWork()) ); connect(this, SIGNAL(stopWorkSignal()), myWorker, SLOT(StopWork()) ); //Debug this->dumpObjectInfo(); myWorker->dumpObjectInfo(); } ThreadTest::~ThreadTest() { delete ui; } void ThreadTest::on_startButton_clicked() { qDebug() << "startwork signal emmitted"; emit startWorkSignal(); } void ThreadTest::on_stopButton_clicked() { qDebug() << "stopwork signal emmitted"; emit stopWorkSignal(); }
worker.h
#include <QObject> #include <QDebug> class worker : public QObject { Q_OBJECT public: explicit worker(QObject *parent = 0); ~worker(); signals: void SignalToObj_mainThreadGUI(); //void running(); //void stopped(); public slots: void StopWork(); void StartWork(); private slots: void do_Work(); private: volatile bool running, stopped; };
worker.cpp
#include "worker.h" worker::worker(QObject *parent) : QObject(parent), stopped(false), running(false) { qDebug() << "running: " << running; qDebug() << "stopped: " << stopped; } worker::~worker() {} void worker::do_Work() { qDebug() << "inside do Work"; emit SignalToObj_mainThreadGUI(); if (!running || stopped) return; // actual work here /* for (int i = 0; i < 100; i++) { qDebug() << "count: " + i; } */ QMetaObject::invokeMethod(this, "do_Work", Qt::QueuedConnection); } void worker::StopWork() { qDebug() << "inside StopWork"; stopped = true; running = false; //emit stopped(); } void worker::StartWork() { qDebug() << "inside StartWork"; stopped = false; running = true; //emit running(); do_Work(); }