Название: многопоточность , start Отправлено: opera от Сентябрь 28, 2020, 19:59 Добрый день, возник следующий вопрос, у меня есть объект obj, который я успешно помещаю в поток и стартую:
Код: QThread* thread = new QThread(this); как мне сделать, если я хочу после завершения выполнения doSomething() использовать этот же объект для другого старта doSomething2()? Код: connect(thread , SIGNAL(started()), obj, SLOT(doSomething2())); Название: 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 Код
Как-то так, пишу по памяти. Название: Re: многопоточность , start Отправлено: opera от Сентябрь 29, 2020, 09:30 Код
Как-то так, пишу по памяти. а второй doSomeThing2 как будет писаться? с учетом первой половины кода Название: Re: многопоточность , start Отправлено: Пантер от Сентябрь 29, 2020, 10:16 Код
Тут зависит от того, что тебе нужно. Название: Re: многопоточность , start Отправлено: opera от Сентябрь 29, 2020, 10:59 Код
Тут зависит от того, что тебе нужно. Код: obj->moveToThread(thread); Название: Re: многопоточность , start Отправлено: Пантер от Сентябрь 29, 2020, 11:04 Код Это тебе зачем? Название: Re: многопоточность , start Отправлено: opera от Сентябрь 29, 2020, 11:06 Код Это тебе зачем? если я делаю invokedMethod() и не предворяю его стартом, то он не запускается, я поэтому и просил кусок полноценного кода, скорее всего я что-то не так пишу только не obj->start, а thread->start() Название: Re: многопоточность , start Отправлено: Авварон от Сентябрь 29, 2020, 13:08 thread->start() надо позвать один раз после того как коннекты настроены.
без start() invokeMethod() положит эвент в очередь эвентов нового треда, но так как тред не запущен, никто эти эвенты не выгребет - поэтому и "не вызывается". Код: connect(obj, SIGNAL(doSomethingFinished()), this , SLOT(onDoSomethingFinished())); можно просто Код: connect(obj, SIGNAL(doSomethingFinished()), obj, SLOT(doSomething2())); Название: Re: многопоточность , start Отправлено: Igors от Сентябрь 29, 2020, 13:10 Код: QThread* thread = new QThread(this); Код По умолчанию она войдет в свой цикл ожидания событий (exec). Пока Вы больше ничего не делаете - запущенная нитка проц не потребляет. Если Вы хотите чтобы она выполняла doSomething, doSomething2 и.т.п. - просто заведите нужные сигналы и посылайте их Вашему obj, он будет из получать в нитке (для этого и делалось moveToThread). Напр Код Когда нитка больше не нужна, сделайте ей quit(), wait() и delete Название: Re: многопоточность , start Отправлено: opera от Сентябрь 29, 2020, 13:19 Код: QThread* thread = new QThread(this); Код По умолчанию она войдет в свой цикл ожидания событий (exec). Пока Вы больше ничего не делаете - запущенная нитка проц не потребляет. Если Вы хотите чтобы она выполняла doSomething, doSomething2 и.т.п. - просто заведите нужные сигналы и посылайте их Вашему obj, он будет из получать в нитке (для этого и делалось moveToThread). Напр Код Когда нитка больше не нужна, сделайте ей quit(), wait() и delete Спасибо огромное за развернутый ответ! Название: Re: многопоточность , start Отправлено: opera от Сентябрь 29, 2020, 13:21 thread->start() надо позвать один раз после того как коннекты настроены. без start() invokeMethod() положит эвент в очередь эвентов нового треда, но так как тред не запущен, никто эти эвенты не выгребет - поэтому и "не вызывается". Код: connect(obj, SIGNAL(doSomethingFinished()), this , SLOT(onDoSomethingFinished())); можно просто Код: connect(obj, SIGNAL(doSomethingFinished()), obj, SLOT(doSomething2())); спасибо тоже за разъяснение,что не остались в стороне! |