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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [решено]Потоки в потоках  (Прочитано 4143 раз)
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« : Март 31, 2010, 15:42 »

Сабж, возможно ли такое? Есть код:
Код:
void ThreadMail::run()
{
 this->socket.moveToThread(this->thread()); //ok
 this->socket.connectToHost("pop.mail.ru", 110); //ok
 if (this->socket.waitForConnected(1000)) //тут ошибка о разных потоках
 {
  qDebug("Connected!");
 }
}
this->socket - не указатель, как видно, а объект. Если это поле декларировать как указатель, а инициализировать в самом run()'e, то конечно всё ок. Подозреваю что waitForConnected() юзает свои потоки, т.е. в потоке нельзя юзать другие потоки. Это так? Или есть ли в этом случае какая-нибудь другая альтернатива кроме инициализации указателя, просто интересно.
« Последнее редактирование: Март 31, 2010, 16:27 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
BRE
Гость
« Ответ #1 : Март 31, 2010, 15:47 »

А при конструировании объекта socket ты указываешь parent?
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #2 : Март 31, 2010, 15:50 »

А при конструировании объекта socket ты указываешь parent?

нет. Он у меня не инициализируются, у него вызывается конструктор по умолчанию.
Записан

kubuntu/Win7/x64/NetBeans
BRE
Гость
« Ответ #3 : Март 31, 2010, 15:55 »

Код
C++ (Qt)
this->socket.moveToThread( this );
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #4 : Март 31, 2010, 15:56 »

Код
C++ (Qt)
this->socket.moveToThread( this );
пробовал, неа
this->socket.moveToThread(this->currentThread()); тоже нет
« Последнее редактирование: Март 31, 2010, 15:58 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
BRE
Гость
« Ответ #5 : Март 31, 2010, 16:08 »

пробовал, неа
В конструкторе.  Улыбающийся
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #6 : Март 31, 2010, 16:20 »

пробовал, неа
В конструкторе.  Улыбающийся
Так работает. А почему надо именно в конструкторе и как лучше делать - инициализировать указатель и декларировать его в run()'e или перемещать объект?
п.с. И всё же - почему ошибка была именно на той функции, можно ли использовать в потоках объекты использующие потоки?
Записан

kubuntu/Win7/x64/NetBeans
BRE
Гость
« Ответ #7 : Март 31, 2010, 16:23 »

Так работает. А почему надо именно в конструкторе и как лучше делать - инициализировать указатель и декларировать его в run()'e или перемещать объект?
Если объект (наследник QObject) создается где то и его нужно использовать в контексте другого потока, то приходиться использовать moveToThread.
А если есть возможность создать его в run, то IMHO не зачем так извращаться.  Улыбающийся
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #8 : Март 31, 2010, 16:26 »

ясно, спасиб
Записан

kubuntu/Win7/x64/NetBeans
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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