Russian Qt Forum

Qt => Вопросы новичков => Тема начата: opera от Сентябрь 28, 2020, 19:59



Название: многопоточность , start
Отправлено: opera от Сентябрь 28, 2020, 19:59
Добрый день, возник следующий вопрос, у меня есть объект obj, который я успешно помещаю в поток и стартую:

Код:
QThread* thread = new QThread(this);
connect(thread , SIGNAL(started()), obj, SLOT(doSomething()));
connect(this, SIGNAL(signalFinishedSumProfit()), thread , SLOT(quit()));
obj->moveToThread(thread );
obj->start();

как мне сделать, если я хочу после завершения выполнения doSomething() использовать этот же объект для другого старта doSomething2()?
Код:
connect(thread , SIGNAL(started()), obj, SLOT(doSomething2()));
connect(this, SIGNAL(signalFinishedSumProfit()), thread , SLOT(quit()));
obj->moveToThread(thread );
obj->start();




Название: Re: многопоточность , start
Отправлено: Пантер от Сентябрь 28, 2020, 23:24
Тебе не надо повторно делать moveToThread. И нить завершать не нужно. Ты можешь дернуть doSomething и doSomething2 через invokeMethod.


Название: Re: многопоточность , start
Отправлено: Авварон от Сентябрь 29, 2020, 02:00
можно в doSomething() кидать сигнал что работа закончена и приконнектить его к doSomething2()


Название: Re: многопоточность , start
Отправлено: opera от Сентябрь 29, 2020, 09:12
можно в doSomething() кидать сигнал что работа закончена и приконнектить его к doSomething2()
Доброе утро, можно на примере небольшом, пожалуйста?


Название: Re: многопоточность , start
Отправлено: opera от Сентябрь 29, 2020, 09:15
Тебе не надо повторно делать moveToThread. И нить завершать не нужно. Ты можешь дернуть doSomething и doSomething2 через invokeMethod.
Доброе утро, спасибо за ответ, не могли бы вы привести пример с кодом?


Название: Re: многопоточность , start
Отправлено: Пантер от Сентябрь 29, 2020, 09:21
Код
C++ (Qt)
QThread* thread = new QThread(this);
obj->moveToThread(thread );
obj->start();
QMetaObject::invokeMethod(obj, "doSomething);

Как-то так, пишу по памяти.


Название: Re: многопоточность , start
Отправлено: opera от Сентябрь 29, 2020, 09:30
Код
C++ (Qt)
QThread* thread = new QThread(this);
obj->moveToThread(thread );
obj->start();
QMetaObject::invokeMethod(obj, "doSomething);

Как-то так, пишу по памяти.

а второй doSomeThing2 как будет писаться? с учетом первой половины кода


Название: Re: многопоточность , start
Отправлено: Пантер от Сентябрь 29, 2020, 10:16
Код
C++ (Qt)
connect(obj, SIGNAL(doSomethingFinished()), this , SLOT(onDoSomethingFinished()));
 
void XXX::onDoSomethingFinished() {
   QMetaObject::invokeMethod(obj, "doSomething2");
}
 

Тут зависит от того, что тебе нужно.


Название: Re: многопоточность , start
Отправлено: opera от Сентябрь 29, 2020, 10:59
Код
C++ (Qt)
connect(obj, SIGNAL(doSomethingFinished()), this , SLOT(onDoSomethingFinished()));
 
void XXX::onDoSomethingFinished() {
   QMetaObject::invokeMethod(obj, "doSomething2");
}
 

Тут зависит от того, что тебе нужно.
я написал так, у меня вроде работает:
Код:
obj->moveToThread(thread);
obj->start();
invokeMethod(obj, "doSomething");
-------------------
obj->start();
invokeMethod(obj, "doSomething2");
это правильно?


Название: Re: многопоточность , start
Отправлено: Пантер от Сентябрь 29, 2020, 11:04
Код
C++ (Qt)
obj->start();
 
Это тебе зачем?


Название: Re: многопоточность , start
Отправлено: opera от Сентябрь 29, 2020, 11:06
Код
C++ (Qt)
obj->start();
 
Это тебе зачем?

если я делаю invokedMethod() и не предворяю его стартом, то он не запускается, я поэтому и просил кусок полноценного кода, скорее всего я что-то не так пишу
только не obj->start, а thread->start()


Название: Re: многопоточность , start
Отправлено: Авварон от Сентябрь 29, 2020, 13:08
thread->start() надо позвать один раз после того как коннекты настроены.
без start() invokeMethod() положит эвент в очередь эвентов нового треда, но так как тред не запущен, никто эти эвенты не выгребет - поэтому и "не вызывается".

Код:
connect(obj, SIGNAL(doSomethingFinished()), this , SLOT(onDoSomethingFinished()));
 
void XXX::onDoSomethingFinished() {
    QMetaObject::invokeMethod(obj, "doSomething2");
}

можно просто

Код:
connect(obj, SIGNAL(doSomethingFinished()), obj, SLOT(doSomething2())); 


Название: Re: многопоточность , start
Отправлено: Igors от Сентябрь 29, 2020, 13:10
Код:
QThread* thread = new QThread(this);
connect(thread , SIGNAL(started()), obj, SLOT(doSomething()));
connect(this, SIGNAL(signalFinishedSumProfit()), thread , SLOT(quit()));
obj->moveToThread(thread );
obj->start();
Не нужно для выполнения одной задачи всякий раз стартовать нитку. Запустите ее 1 раз
Код
C++ (Qt)
QThread* thread = new QThread(this);
obj->moveToThread(thread );
thread->start();
По умолчанию она войдет в свой цикл ожидания событий (exec). Пока Вы больше ничего не делаете - запущенная нитка проц не потребляет. Если Вы хотите чтобы она выполняла doSomething, doSomething2 и.т.п. - просто заведите нужные сигналы и посылайте их Вашему obj, он будет из получать в нитке (для этого и делалось moveToThread). Напр
Код
C++ (Qt)
connect(this, SIGNAL(doSomething()), obj, SLOT(doSomething()));
connect(this, SIGNAL(doSomething2()), obj, SLOT(doSomething2()));
...
emit doSomething();
...
emit doSomething2();
 
Когда нитка больше не нужна, сделайте ей quit(), wait() и delete


Название: Re: многопоточность , start
Отправлено: opera от Сентябрь 29, 2020, 13:19
Код:
QThread* thread = new QThread(this);
connect(thread , SIGNAL(started()), obj, SLOT(doSomething()));
connect(this, SIGNAL(signalFinishedSumProfit()), thread , SLOT(quit()));
obj->moveToThread(thread );
obj->start();
Не нужно для выполнения одной задачи всякий раз стартовать нитку. Запустите ее 1 раз
Код
C++ (Qt)
QThread* thread = new QThread(this);
obj->moveToThread(thread );
thread->start();
По умолчанию она войдет в свой цикл ожидания событий (exec). Пока Вы больше ничего не делаете - запущенная нитка проц не потребляет. Если Вы хотите чтобы она выполняла doSomething, doSomething2 и.т.п. - просто заведите нужные сигналы и посылайте их Вашему obj, он будет из получать в нитке (для этого и делалось moveToThread). Напр
Код
C++ (Qt)
connect(this, SIGNAL(doSomething()), obj, SLOT(doSomething()));
connect(this, SIGNAL(doSomething2()), obj, SLOT(doSomething2()));
...
emit doSomething();
...
emit doSomething2();
 
Когда нитка больше не нужна, сделайте ей quit(), wait() и delete

Спасибо огромное за развернутый ответ!


Название: Re: многопоточность , start
Отправлено: opera от Сентябрь 29, 2020, 13:21
thread->start() надо позвать один раз после того как коннекты настроены.
без start() invokeMethod() положит эвент в очередь эвентов нового треда, но так как тред не запущен, никто эти эвенты не выгребет - поэтому и "не вызывается".

Код:
connect(obj, SIGNAL(doSomethingFinished()), this , SLOT(onDoSomethingFinished()));
 
void XXX::onDoSomethingFinished() {
    QMetaObject::invokeMethod(obj, "doSomething2");
}

можно просто

Код:
connect(obj, SIGNAL(doSomethingFinished()), obj, SLOT(doSomething2())); 

спасибо тоже за разъяснение,что не остались в стороне!