Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: BuRn от Март 16, 2015, 23:20



Название: EventLoop
Отправлено: 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();
}


Название: Re: EventLoop
Отправлено: Old от Март 17, 2015, 02:09
У каждого потока есть своя очередь событий, одна.
Цикл обработки событий работает в том потоке, в котором запущен и обрабатывает очередь событий того потока, в котором запущен.
Т.е. если вы сами не запускаете eventlop, в другом потоке, значит он работает в gui потоке и поэтому, этот поток замирает в слипе.
Кстати, sleep течет, никто не удаляет объекты класса QEventLoop. Проще их создовать на стеке.