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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Методы объектов одного класса, находящихся в разных потоках.  (Прочитано 4245 раз)
alsav22
Гость
« : Март 09, 2014, 09:26 »

Есть class Worker : public QObject, в нём - слот process(). Создаётся несколько объектов QThread и несколько объеков Worker. Каждый объект Worker, с помощью moveToThread(), помещается в свой поток. Метод process(), у этих объектов, общий или у каждого свой?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Март 09, 2014, 09:56 »

Не понял что значит "общий/свой (метод)", возможно Вы хотели спросить в каких нитках они будут выполняться - это зависит от вызова и типа connect 
Записан
Serr500
Гость
« Ответ #2 : Март 09, 2014, 10:41 »

Реализация метода общая (компилятор создаст один экземпляр бинарного кода метода), он всегда будет вызываться по одному и тому же адресу для каждого объекта, но выполняется он в контексте различных объектов (получит разные указатели this). Но, кажется, Вы сами не понимаете что хотите спросить.
« Последнее редактирование: Март 09, 2014, 10:45 от Serr500 » Записан
Bepec
Гость
« Ответ #3 : Март 09, 2014, 10:44 »

Он видимо хочет спросить будут ли во всех объектах Worker доступны одни и те же переменные и данные. Ответ - нет не будут, для каждого объекта будут свои переменные и данные Улыбающийся
Записан
alsav22
Гость
« Ответ #4 : Март 09, 2014, 21:24 »

Не понял что значит "общий/свой (метод)"
Будет ли этот метод совместным ресурсом для объектов в разных потоках?

Он видимо хочет спросить будут ли во всех объектах Worker доступны одни и те же переменные
Где это в моём вопросе?

Реализация метода общая (компилятор создаст один экземпляр бинарного кода метода), он всегда будет вызываться по одному и тому же адресу для каждого объекта, но выполняется он в контексте различных объектов (получит разные указатели this). Но, кажется, Вы сами не понимаете что хотите спросить.
Очень даже поимаю, что хочу спросить. Всё это азбучные истины, когда объекты находятся в одном потоке. Весь вопрос в том, что объекты находятся в разных потоках. Если реализация метода общая, то он становится совместным ресурсом для объектов в разных потоках, с соответствующими последствиями. Тогда, в этом методе, будут работать методы синхронизации (мьютексы и пр.), а они не работают, из чего следует, что метод не является общим ресурсом, а значит для каждого потока существует свой метод, что противоречит тому, что вы изложили и что верно, когда объекты находятся в одном потоке.
« Последнее редактирование: Март 09, 2014, 21:28 от alsav22 » Записан
Bepec
Гость
« Ответ #5 : Март 10, 2014, 00:52 »

По моему вы бред несёте Улыбающийся ИМХО.
Записан
alsav22
Гость
« Ответ #6 : Март 10, 2014, 05:06 »

По моему вы бред несёте Улыбающийся ИМХО.
Очень может быть, но хотелось бы аргументированных ответов. Я вопрос задал, и объяснил, почему он у меня возник, т.е. логику моих рассуждений. Вполне возможно, что она неверна (ветка форума для новичков или для профи?). В чём? Почему? А писать, вместо помощи, что человек, мол, больной и бредит, как-то не очень по-взрослому, по-моему...
« Последнее редактирование: Март 10, 2014, 05:19 от alsav22 » Записан
Bepec
Гость
« Ответ #7 : Март 10, 2014, 08:15 »

Я не понимаю что вы имеете в виду под "общий ресурс". Поясните простыми словами. (простые !=  фразы из учебников и диспутов)
И да, объекты не в потоке и объекты в потоке - это одно и то же. Объект будет всё так же лежать по определённому адресу, просто дёргать его будут в другое время.

Конкретно в вашем случае будет несколько областей памяти в которых будут созданы объекты классов Worker. И ни один другого знать не будет. И ничего совместного у них не будет. И вообще они будут знать только своего родителя QObject.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Март 10, 2014, 09:09 »

Будет ли этот метод совместным ресурсом для объектов в разных потоках?
Нет, не будет, это просто код который может выполняться в любой нитке. Разумеется используя контекст объекта/нитки, но сам по себе код не ресурс.

Тогда, в этом методе, будут работать методы синхронизации (мьютексы и пр.), а они не работают, из чего следует,
Проще и лучше привести пример что не работает,

Записан
Serr500
Гость
« Ответ #9 : Март 10, 2014, 09:28 »

Весь вопрос в том, что объекты находятся в разных потоках. Если реализация метода общая, то он становится совместным ресурсом для объектов в разных потоках, с соответствующими последствиями. Тогда, в этом методе, будут работать методы синхронизации (мьютексы и пр.), а они не работают, из чего следует, что метод не является общим ресурсом, а значит для каждого потока существует свой метод, что противоречит тому, что вы изложили и что верно, когда объекты находятся в одном потоке.
Реализация метода общая, его код - совместный ресурс, но каждый запуск этого метода в пределах разных потоков (и даже разных экземпляров класса) - независим. Каждый раз при запуске метода он выполняется в контексте вызывающего объекта, получает его ресурсы, локальные переменные для каждого запуска свои. Подозреваю, что у Вас внутри метода создаётся мьютекс и синхронизации не происходит, потому что для каждого объекта мьютекс будет свой. Для таких случаев мьютекс должен быть глобальным (static для класса).

P.S. Вы путаете реализацию метода, которую создаёт компилятор, и выполнение метода, происходящее в runtime. Это абсолютно разные вещи! На Ваш вопрос в первом посте ответ такой: метод общий для всех и одновременно для каждого свой.
Записан
alsav22
Гость
« Ответ #10 : Март 10, 2014, 20:00 »

Bepec, Igors, Serr500, благодарю за ответы, дошло.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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