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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: EventLoop  (Прочитано 3357 раз)
BuRn
Гость
« : Март 16, 2015, 23:20 »

Есть класс, у которого в конструкторе навешан обработчик на чтение некоторых данных.
Есть у класса деструктор, который вызывается в рандомное время(зависит от пользователя). Проблема в следующем, сам класс с этим обработчиком находится в гуи потоке, когда срабатывает сигнал, обработчик на сколько я понимаю отрабатывает уже не в гуишном потоке и того получаем 2 потока. Так вот, поставил локер, пока поток от слота не отработает, ожидать в деструкторе завершения работы слота. Но в слоте присутствует QEventLoop для паузы, и вот по непонятным мне причинам, когда я делаю     QMutexLocker lockers(&_mtx);, поток с обработчиком(слотом) просто замирает, а замирает на паузе которая сделана через QEventLoop. Я так предполагаю я залочил поток со слотом, подскажите как быть. Просьба сильно не пинать, только начинаю разбираться с многопоточностью.
Пауза выглядит так:
Код:
void sleep(int ms)
{
    QEventLoop *loop = new QEventLoop;
    QTimer::singleShot(ms, loop, SLOT(quit()));
    loop->exec();
}
« Последнее редактирование: Март 16, 2015, 23:42 от BuRn » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

У каждого потока есть своя очередь событий, одна.
Цикл обработки событий работает в том потоке, в котором запущен и обрабатывает очередь событий того потока, в котором запущен.
Т.е. если вы сами не запускаете eventlop, в другом потоке, значит он работает в gui потоке и поэтому, этот поток замирает в слипе.
Кстати, sleep течет, никто не удаляет объекты класса QEventLoop. Проще их создовать на стеке.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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