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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Передача QWidget* в другой поток[РЕШЕНО]  (Прочитано 9273 раз)
d13mon
Гость
« : Апрель 03, 2012, 11:06 »

Вот такая проблема возникла.  Передаю QWidget* в класс, который находится в другом потоке. Другой поток отвечает за вывод видео. И мне нужно передать туда виджет, чтобы прицепить вывод к нему (выводить видео на него). Получаю assert "Cannot send events to objects owned by a different thread".

Если так делать нельзя, то каков верный путь?

Если так делать можно, то как решить данную проблему?
« Последнее редактирование: Апрель 03, 2012, 18:45 от d13mon » Записан
mutineer
Гость
« Ответ #1 : Апрель 03, 2012, 11:10 »

GUI можно трогать только из основного потока. Возможно сигнал-слот поможет
Записан
d13mon
Гость
« Ответ #2 : Апрель 03, 2012, 12:08 »

GUI можно трогать только из основного потока. Возможно сигнал-слот поможет

Правильно ли я вас понял: с классами производными от QWidget можно работать только в контексте основного потока и  передавать их и даже указатели на них в другой поток нельзя?
Записан
mutineer
Гость
« Ответ #3 : Апрель 03, 2012, 12:09 »

Передавать-то указатели можно, но совершать с ними действия, влияющие на GUI можно только из основного потока
Записан
Bepec
Гость
« Ответ #4 : Апрель 03, 2012, 12:18 »

немного неверно. При сигнал слотовом соединении можно добиться того,чтобы слот выполнялся в своём потоке.(т.е. основном)
Записан
mutineer
Гость
« Ответ #5 : Апрель 03, 2012, 12:26 »

Что неверного-то?
Записан
Bepec
Гость
« Ответ #6 : Апрель 03, 2012, 12:29 »

Т.е. если я в потоке вызову через очередь "show/hide/resize", то "show/hide/resize" выполнится в основном потоке. Али не так? убеди меня.
Записан
mutineer
Гость
« Ответ #7 : Апрель 03, 2012, 12:30 »

В чем убедить? В том, что с гуем действия можно выполнять только из основного потока?
Записан
d13mon
Гость
« Ответ #8 : Апрель 03, 2012, 12:39 »

Единственное действие, которое я выполняю над  виджетом во втором потоке  - это вызываю метод WId(). На нём и возникает assert. При этом если просто передавать во второй поток WId  виджета вместо самого виджета, то всё нормально.






Записан
Bepec
Гость
« Ответ #9 : Апрель 03, 2012, 12:41 »

mutineer мы оба правы.

Выполняться действие должно в основном потоке. Но вызывать действие можно из любого потока через сигнал слоты Подмигивающий
Записан
mutineer
Гость
« Ответ #10 : Апрель 03, 2012, 12:43 »

mutineer мы оба правы.

Выполняться действие должно в основном потоке. Но вызывать действие можно из любого потока через сигнал слоты Подмигивающий

Действие при этом где произойдет? В основном потоке же. И совершенно неважно как и откуда оно инициировано, главное где выполнится
Записан
mutineer
Гость
« Ответ #11 : Апрель 03, 2012, 12:44 »

Единственное действие, которое я выполняю над  виджетом во втором потоке  - это вызываю метод WId(). На нём и возникает assert. При этом если просто передавать во второй поток WId  виджета вместо самого виджета, то всё нормально.

Вот тебе и решение
Записан
Bepec
Гость
« Ответ #12 : Апрель 03, 2012, 12:45 »

Или как вариант используй сигнал слотовые соединения Улыбающийся
Записан
d13mon
Гость
« Ответ #13 : Апрель 03, 2012, 12:55 »

Единственное действие, которое я выполняю над  виджетом во втором потоке  - это вызываю метод WId(). На нём и возникает assert. При этом если просто передавать во второй поток WId  виджета вместо самого виджета, то всё нормально.

Вот тебе и решение

От этого я наоборот ушел в сторону виджета.
Записан
d13mon
Гость
« Ответ #14 : Апрель 03, 2012, 12:57 »

В общем спасибо, Верес и mutineer.

Буду пробовать через сигнал-слот.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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