qt Передача данных из QThread в основной поток - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь создать отдельный поток обработки данных, а затем передать его в основной поток.Вот что я думаю сделать:

class Worker : public Object
{
    Q_BOJECT
    public:
        Worker(){
            QThread* thread = new QThread;
            this->moveToThread(thread);
        };
        ~Worker();
        DataClass* data1;
        int data2
        QThread* thread;

    public slots:
        void process(){
            //do something to create DataClass* data1 and int Data2
            moveToThread(QApplication::instance()->thread());
            Q_EMIT ImDone(this);
        };
    signals:
        void ImDone(Worker * data);
}

class MainWin : public QMainWindow
{
    Q_BOJECT
    public:
        MainWin(){
            QTreeWidget* tree=new QTreeWidget();
        };
        ~MainWin();
        void callWorker(){
            Worker* worker = new Worker();
            connect(this, SIGNAL(startWorker()), worker, SLOT(process()));
            connect(worker, SIGNAL(ImDone(Worker *)), this, SLOT(processWorkerResult(Worker *)));
            Q_EMIT startWorker();
        };
        QTreeView* tree;

    public slots:
        void processWorkerResult(Worker *worker){                 
            //process Worker data1 and data2, update QTreeWidget* tree
        };
    signals:
        void startWorker();
}

Мысль заключается в том, что я создаю рабочий поток в основном потоке, запускаю рабочий, отправляя ему сигнал (MainWin :: startWorker ()),Рабочий поток начинает работу, а затем отправляет сигнал с указателем на данные (Worker :: ImDone (Worker *)) обратно в главный поток.Затем основной поток обрабатывает данные и обновляет свой компонент (скажем, QTreeWidget).Это выглядит нормально?

Может кто-нибудь объяснить, как обрабатывается событие сигнала / слота в главном потоке?Если пользователь запускает двух разных рабочих, которые заканчивают одновременно (буквально), это приведет к тому, что два экземпляра MainWin :: processWorkerResult будут запущены одновременно друг над другом?Если так, то это кажется проблемой ... Спасибо.

...