Russian Qt Forum
Июнь 16, 2024, 09:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: 1 ... 3 4 [5]   Вниз
  Печать  
Автор Тема: MoveToThread (все-таки хочется понять ..)  (Прочитано 47214 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #60 : Май 26, 2012, 09:39 »

А если делать это в одном классе, то нельзя будет создавать Scanner имеющим родителя.
Ну и чем это грозит? Scanner не удалится автоматычно при удалении родителя? Так это и нежелательно т.к. все равно нитку надо завершать. Поэтому лучше напр сделать указатель Scanner членом и в деструкторе разобраться
Записан
andrew.k
Гость
« Ответ #61 : Май 27, 2012, 00:22 »

А если делать это в одном классе, то нельзя будет создавать Scanner имеющим родителя.
Ну и чем это грозит? Scanner не удалится автоматычно при удалении родителя? Так это и нежелательно т.к. все равно нитку надо завершать. Поэтому лучше напр сделать указатель Scanner членом и в деструкторе разобраться
Какие проблемы завершить нитку в деструкторе Scanner? Сложно что ли?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #62 : Май 27, 2012, 10:37 »

Какие проблемы завершить нитку в деструкторе Scanner? Сложно что ли?
Технически никаких, но это "архитектурно некрасиво" Улыбающийся Чтобы завершить нитку в деструкторе Scaner, указатель на QThread должен быть членом Scanner, и зависеть от него. Тогда чего было притворяться и избегать наследования от QThread ?
Записан
andrew.k
Гость
« Ответ #63 : Май 27, 2012, 12:16 »

Какие проблемы завершить нитку в деструкторе Scanner? Сложно что ли?
Технически никаких, но это "архитектурно некрасиво" Улыбающийся Чтобы завершить нитку в деструкторе Scaner, указатель на QThread должен быть членом Scanner, и зависеть от него.
Естественно QThread член класса. Я ж написал, хочу все в одном классе, чтобы все само работало.
А внешний юзер даже не знал ничего про потоки.
членом Scanner, и зависеть от него. Тогда чего было притворяться и избегать наследования от QThread ?
Чтобы получить "архитектурно красиво".
Это в этом топике еще как-то лояльно обсуждают подход. Оригинальная же статья не выделяет преимуществ и недостатков, а говорит о том, что наследоваться неправильно. QThread уже готовый класс и нечего от него наследовать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #64 : Май 27, 2012, 12:57 »

Естественно QThread член класса. Я ж написал, хочу все в одном классе, чтобы все само работало.
А внешний юзер даже не знал ничего про потоки.
Как я понимаю, смысл того что пишут (и активно повторяют) в том что Scanner не должен ничего знать о том в какой QThread он выполняется. Завязывая его с QThread (через наследование или членом класса) мы теряем гибкость. Напр др экземпляр Scanner потребовался в главной нитке или хотим иметь что-то еще (кроме Scanner) в той же нитке, или двигать его туда-сюда. Это достигается легко, напр
Код
C++ (Qt)
void MyClass::RunScanner( void )
{
if (!mThread)
  mThread = new QThread(this);
mScanner = new Scanner(0);
mScanner->moveToThread(mThread);
..
}
 
Да, так 2 класса, но это не накладно. Можно все в одном, ну тогда наследоваться или делать один членом другого (особой разницы нет). 
Записан
andrew.k
Гость
« Ответ #65 : Май 27, 2012, 14:44 »

Естественно QThread член класса. Я ж написал, хочу все в одном классе, чтобы все само работало.
А внешний юзер даже не знал ничего про потоки.
Как я понимаю, смысл того что пишут (и активно повторяют) в том что Scanner не должен ничего знать о том в какой QThread он выполняется. Завязывая его с QThread (через наследование или членом класса) мы теряем гибкость. Напр др экземпляр Scanner потребовался в главной нитке или хотим иметь что-то еще (кроме Scanner) в той же нитке, или двигать его туда-сюда. Это достигается легко, напр
Код
C++ (Qt)
void MyClass::RunScanner( void )
{
if (!mThread)
  mThread = new QThread(this);
mScanner = new Scanner(0);
mScanner->moveToThread(mThread);
..
}
 
Scanner всегда должен выполняться в отдельном потоке, в этом и смысл. Поэтому зачем пользователя этого класса заставлять каждый раз делать одно и тоже, если об этом может позаботиться сам класс?

Да, так 2 класса, но это не накладно. Можно все в одном, ну тогда наследоваться или делать один членом другого (особой разницы нет). 
в том и дело, что разница есть. Если делать членом, то экземпляр класса не должен иметь родителя.
Хотелось бы чтобы он был. Но в общем-то это практически не важно. Поэтому пока сделал без родителя.

Естественно QThread член класса. Я ж написал, хочу все в одном классе, чтобы все само работало.
А внешний юзер даже не знал ничего про потоки.
Как я понимаю, смысл того что пишут (и активно повторяют) в том что Scanner не должен ничего знать о том в какой QThread он выполняется.
Так он и так не знает, его реализация не завязана на потоке. Просто его код выполняется в потоке созданном самим классом.
При желании его так же можно подвинуть в любой другой поток.
Записан
Страниц: 1 ... 3 4 [5]   Вверх
  Печать  
 
Перейти в:  


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