Russian Qt Forum
Ноябрь 23, 2024, 03:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: многопоточность , start  (Прочитано 5766 раз)
opera
Чайник
*
Offline Offline

Сообщений: 93


Просмотр профиля
« : Сентябрь 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();


Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Сентябрь 28, 2020, 23:24 »

Тебе не надо повторно делать moveToThread. И нить завершать не нужно. Ты можешь дернуть doSomething и doSomething2 через invokeMethod.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #2 : Сентябрь 29, 2020, 02:00 »

можно в doSomething() кидать сигнал что работа закончена и приконнектить его к doSomething2()
Записан
opera
Чайник
*
Offline Offline

Сообщений: 93


Просмотр профиля
« Ответ #3 : Сентябрь 29, 2020, 09:12 »

можно в doSomething() кидать сигнал что работа закончена и приконнектить его к doSomething2()
Доброе утро, можно на примере небольшом, пожалуйста?
Записан
opera
Чайник
*
Offline Offline

Сообщений: 93


Просмотр профиля
« Ответ #4 : Сентябрь 29, 2020, 09:15 »

Тебе не надо повторно делать moveToThread. И нить завершать не нужно. Ты можешь дернуть doSomething и doSomething2 через invokeMethod.
Доброе утро, спасибо за ответ, не могли бы вы привести пример с кодом?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Сентябрь 29, 2020, 09:21 »

Код
C++ (Qt)
QThread* thread = new QThread(this);
obj->moveToThread(thread );
obj->start();
QMetaObject::invokeMethod(obj, "doSomething);

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

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
opera
Чайник
*
Offline Offline

Сообщений: 93


Просмотр профиля
« Ответ #6 : Сентябрь 29, 2020, 09:30 »

Код
C++ (Qt)
QThread* thread = new QThread(this);
obj->moveToThread(thread );
obj->start();
QMetaObject::invokeMethod(obj, "doSomething);

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

а второй doSomeThing2 как будет писаться? с учетом первой половины кода
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Сентябрь 29, 2020, 10:16 »

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

Тут зависит от того, что тебе нужно.
« Последнее редактирование: Сентябрь 29, 2020, 10:19 от Пантер » Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
opera
Чайник
*
Offline Offline

Сообщений: 93


Просмотр профиля
« Ответ #8 : Сентябрь 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");
это правильно?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Сентябрь 29, 2020, 11:04 »

Код
C++ (Qt)
obj->start();
 
Это тебе зачем?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
opera
Чайник
*
Offline Offline

Сообщений: 93


Просмотр профиля
« Ответ #10 : Сентябрь 29, 2020, 11:06 »

Код
C++ (Qt)
obj->start();
 
Это тебе зачем?

если я делаю invokedMethod() и не предворяю его стартом, то он не запускается, я поэтому и просил кусок полноценного кода, скорее всего я что-то не так пишу
только не obj->start, а thread->start()
« Последнее редактирование: Сентябрь 29, 2020, 11:09 от opera » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #11 : Сентябрь 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())); 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Сентябрь 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
« Последнее редактирование: Сентябрь 29, 2020, 13:13 от Igors » Записан
opera
Чайник
*
Offline Offline

Сообщений: 93


Просмотр профиля
« Ответ #13 : Сентябрь 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

Спасибо огромное за развернутый ответ!
Записан
opera
Чайник
*
Offline Offline

Сообщений: 93


Просмотр профиля
« Ответ #14 : Сентябрь 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())); 

спасибо тоже за разъяснение,что не остались в стороне!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.28 секунд. Запросов: 23.