Название: QThread, ожидание в потоке Отправлено: 0xFF от Март 24, 2010, 21:45 Доброго времени суток
Функция run() выглядит примерно так Код
Собственно нужно подождать пока выполнится obj->func(i), для этого использую while( !stopped ) {}, переменная stopped меняется при поступлении сигнала от obj. Но что-то этот while( !stopped ) {} кажется каким-то "говнистым", есть другие способы? Название: Re: QThread, ожидание в потоке Отправлено: SimpleSunny от Март 24, 2010, 22:13 Можно добавить слот, в который будет приходить сигнал.
Код: f1() Название: Re: QThread, ожидание в потоке Отправлено: alexman от Март 24, 2010, 23:49 Код: void myThread::run() { Название: Re: QThread, ожидание в потоке Отправлено: alexman от Март 24, 2010, 23:53 Код
Название: Re: QThread, ожидание в потоке Отправлено: 0xFF от Март 25, 2010, 01:04 Хм, спасибо за ответы.
Название: Re: QThread, ожидание в потоке Отправлено: Igors от Март 25, 2010, 11:48 Код QMutex здесь не подходит, если нитка захватила мутекс - она же (и только она) должна его освободить. Цивильное решение - использовать семафор Код А "наблюдающий" должен открыть семафор Код: theSemaphore.release(); Название: Re: QThread, ожидание в потоке Отправлено: alexman от Март 25, 2010, 12:00 Код QMutex здесь не подходит, если нитка захватила мутекс - она же (и только она) должна его освободить. Цивильное решение - использовать семафор Цитировать void myThread::run() { А там где ты меняешь stopped, сделай waitCondition.wakeOne();QMutex m; for(int i=0; i<dataSize; ++i) { obj->func(i); ... m.lock(); waitCondition.wait( &m ); m.unlock(); } } Название: Re: QThread, ожидание в потоке Отправлено: Igors от Март 25, 2010, 12:51 Через waitCondition тоже можно, но тогда по-моему так
Код
Название: Re: QThread, ожидание в потоке Отправлено: alexman от Март 25, 2010, 13:28 Смысл? wakeOne может вызваться только после obj->func(i) (это конечно, если я код правильно понимаю ;)).
Название: Re: QThread, ожидание в потоке Отправлено: Igors от Март 25, 2010, 14:32 Смысл? wakeOne может вызваться только после obj->func(i) (это конечно, если я код правильно понимаю ;)). wakeOne вызывается из др. нитки, поэтому если оно придет до того как мутекс заперт - будет не гудНазвание: Re: QThread, ожидание в потоке Отправлено: alexman от Март 25, 2010, 15:21 Смысл? wakeOne может вызваться только после obj->func(i) (это конечно, если я код правильно понимаю ;)). wakeOne вызывается из др. нитки, поэтому если оно придет до того как мутекс заперт - будет не гудНазвание: Re: QThread, ожидание в потоке Отправлено: Igors от Март 25, 2010, 16:34 Нет, не выплясывается через wakeOne - этот метод не имеет эффекта если нет "ожидающих". Значит если wakeOne проскочит до wait - тому остается ждать forever :'(
Мда... а на примерах все так легко и понятно :) Название: Re: QThread, ожидание в потоке Отправлено: SASA от Март 25, 2010, 17:04 Код: bool stopped; Но если семафор позволяет работать из разных потоков, он будет быстрее. Название: Re: QThread, ожидание в потоке Отправлено: alexman от Март 25, 2010, 17:30 Код: bool stopped; Но если семафор позволяет работать из разных потоков, он будет быстрее. Название: Re: QThread, ожидание в потоке Отправлено: pastor от Март 25, 2010, 19:10 Код
unLock после return это сильно. Название: Re: QThread, ожидание в потоке Отправлено: alexman от Март 25, 2010, 19:28 Код
unLock после return это сильно. Код
Название: Re: QThread, ожидание в потоке Отправлено: SASA от Март 26, 2010, 00:14 unLock после return это сильно. Код [/quote] Спасибо за замечание. Я сам пользуюсь QMutexLocker, поэтому на ретуны внимания не обращаю. Цитировать Под виндой не скомпилится! Почему?Название: Re: QThread, ожидание в потоке Отправлено: alexman от Март 26, 2010, 13:44 unLock после return это сильно. Код
Цитировать Под виндой не скомпилится! Почему?[/quote] sleep Название: Re: QThread, ожидание в потоке Отправлено: Akaiten от Март 26, 2010, 17:26 sleep Странно, есть же QThread::sleep() или что тоже самое под виндой - WinAPI функция Sleep().Название: Re: QThread, ожидание в потоке Отправлено: Igors от Март 27, 2010, 12:45 Предлагаю так через wakeOne
Код
|