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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QThread, ожидание в потоке  (Прочитано 10364 раз)
0xFF
Гость
« : Март 24, 2010, 21:45 »

Доброго времени суток
Функция run() выглядит примерно так

Код
C++ (Qt)
void myThread::run() {
for(int i=0; i<dataSize; ++i) {
obj->func(i);
...
stopped = false;
while( !stopped ) {}
}
}

Собственно нужно подождать пока выполнится obj->func(i),  для этого использую while( !stopped ) {}, переменная stopped меняется при поступлении сигнала от obj.
Но что-то этот while( !stopped ) {} кажется каким-то "говнистым", есть другие способы?
Записан
SimpleSunny
Гость
« Ответ #1 : Март 24, 2010, 22:13 »

Можно добавить слот, в который будет приходить сигнал.

Код:
f1()
{
if (i >= dataSize())
quit;

obj->func(i);
}

f2()
{
++i;
f1();
}

run()
{
i = 0;
f1();
exec();
}
« Последнее редактирование: Март 24, 2010, 22:46 от SimpleSunny » Записан
alexman
Гость
« Ответ #2 : Март 24, 2010, 23:49 »

Код:
void myThread::run() {
for(int i=0; i<dataSize; ++i) {
obj->func(i);
...
QMutex m;
                m.lock();

                waitCondition.wait( &m );
}
}
waitCondition - это QWaitCondition. А там где ты меняешь stopped, сделай waitCondition.wakeOne();
Записан
alexman
Гость
« Ответ #3 : Март 24, 2010, 23:53 »

Код
C++ (Qt)
stopped = false;
while( !stopped ) {}
 
Так плохо! Процессор конкретно грузим!
Записан
0xFF
Гость
« Ответ #4 : Март 25, 2010, 01:04 »

Хм, спасибо за ответы.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Март 25, 2010, 11:48 »

Код
C++ (Qt)
void myThread::run() {
for(int i=0; i<dataSize; ++i) {
obj->func(i);
...                       // что если stopped = true будет в этот момент?
stopped = false;    // или в этот?
while( !stopped ) {}  //  а не в этот как рассчитывали
}
}
QMutex здесь не подходит, если нитка захватила мутекс - она же (и только она) должна его освободить. Цивильное решение - использовать семафор

Код
C++ (Qt)
QSemaphore theSemaphore;
...
void myThread::run() {
for(int i=0; i<dataSize; ++i) {
               theSemaphore.acquire();
obj->func(i);
}
}
А "наблюдающий" должен открыть семафор
Код:
theSemaphore.release();
Записан
alexman
Гость
« Ответ #6 : Март 25, 2010, 12:00 »

Код
C++ (Qt)
void myThread::run() {
for(int i=0; i<dataSize; ++i) {
obj->func(i);
...                       // что если stopped = true будет в этот момент?
stopped = false;    // или в этот?
while( !stopped ) {}  //  а не в этот как рассчитывали
}
}
QMutex здесь не подходит, если нитка захватила мутекс - она же (и только она) должна его освободить. Цивильное решение - использовать семафор
Цитировать
void myThread::run() {
       QMutex m;
   for(int i=0; i<dataSize; ++i) {
      obj->func(i);
      ...
                m.lock();
                waitCondition.wait( &m );
                m.unlock();
   }
}
А там где ты меняешь stopped, сделай waitCondition.wakeOne();
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Март 25, 2010, 12:51 »

Через waitCondition тоже можно, но тогда по-моему так
Код
C++ (Qt)
void myThread::run() {
      QMutex m;
for(int i=0; i<dataSize; ++i) {
               m.lock();
obj->func(i);
...
               waitCondition.wait( &m );
               m.unlock();
}
}
 
Записан
alexman
Гость
« Ответ #8 : Март 25, 2010, 13:28 »

Смысл? wakeOne может вызваться только после obj->func(i) (это конечно, если я код правильно понимаю Подмигивающий).
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Март 25, 2010, 14:32 »

Смысл? wakeOne может вызваться только после obj->func(i) (это конечно, если я код правильно понимаю Подмигивающий).
wakeOne вызывается из др. нитки, поэтому если оно придет до того как мутекс заперт - будет не гуд
Записан
alexman
Гость
« Ответ #10 : Март 25, 2010, 15:21 »

Смысл? wakeOne может вызваться только после obj->func(i) (это конечно, если я код правильно понимаю Подмигивающий).
wakeOne вызывается из др. нитки, поэтому если оно придет до того как мутекс заперт - будет не гуд
Точняк Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Март 25, 2010, 16:34 »

Нет, не выплясывается через wakeOne - этот метод не имеет эффекта если нет "ожидающих". Значит если wakeOne проскочит до wait - тому остается ждать forever  Плачущий

Мда... а на примерах все так легко и понятно  Улыбающийся
Записан
SASA
Гость
« Ответ #12 : Март 25, 2010, 17:04 »

Код:
bool stopped;
QMutex stoppedMutex;

void setStopped(bool _s)
{
stoppedMutex.lock();
stopped = _s;
stoppedMutex.unLock();
}
bool sStopped()
{
stoppedMutex.lock();
return stopped;
stoppedMutex.unLock();

}
void run()
{
...
while( !isStopped() ) { sleep(1); }  //  а не в этот как рассчитывали
...
}
Работает, процессор не грузит.
Но если семафор позволяет работать из разных потоков, он будет быстрее.
Записан
alexman
Гость
« Ответ #13 : Март 25, 2010, 17:30 »

Код:
bool stopped;
QMutex stoppedMutex;

void setStopped(bool _s)
{
stoppedMutex.lock();
stopped = _s;
stoppedMutex.unLock();
}
bool sStopped()
{
stoppedMutex.lock();
return stopped;
stoppedMutex.unLock();

}
void run()
{
...
while( !isStopped() ) { sleep(1); }  //  а не в этот как рассчитывали
...
}
Работает, процессор не грузит.
Но если семафор позволяет работать из разных потоков, он будет быстрее.
Под виндой не скомпилится!
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #14 : Март 25, 2010, 19:10 »

Код
C++ (Qt)
bool sStopped()
{
stoppedMutex.lock();
return stopped;
stoppedMutex.unLock();
 
}

unLock после return это сильно.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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