Я пытаюсь создать отдельный поток обработки данных, а затем передать его в основной поток.Вот что я думаю сделать:
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 будут запущены одновременно друг над другом?Если так, то это кажется проблемой ... Спасибо.