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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: потоки, критические секции, QMutex  (Прочитано 6210 раз)
myr
Гость
« : Май 06, 2010, 10:04 »

Здраствуйте, помогите разобраться.
Есть главная программа, из нее вызываеться внешняя функция, которая запускает дочерний поток.
Как код или вызов внешней функции сделать критическим.?

QMutexLocker locker( &mutexReadBd);   - выдает что мутех заблокирован этим же потоком, но продолжает выполняться дальше.
Функцию readBd()  я вызывыю из  главной программы, по кнопке.
Я хочу что бы  при следующем вызове функции, программы закончила текущий запрос, а потом начала следующий. Как-бы в стек их сложила.


Код:
// QMutex * mutexReadBd; //  внешняя, new в init() 
bool readBd(){
//QMutexLocker locker( &mutexReadBd);  
  QWaitCondition waitCondition;
  waitCondition.wait(mutexReadBd,10000);
  TEventStartThread * pe = new TEventStartThread();  //  ..запуск дочернего потока в котором  блокирутся  и освобождаеться mutexReadBd
  QApplication::postEvent(qApp->mainWidget(),pe);
  if(ProgressIsActive == spStop)
return true;

Код:
void frmMain::customEvent( QCustomEvent *pe )
{
   switch((int)pe->type()){
      case TEventStartThread::TypeEvent:{
       beginThread(qry,str);
break; }
  }
}

Код:
void frmMain::beginThread( QSqlQuery * qry, QString  str )
{
  [b]mutexReadBd->lock();[/b]
  ProgressIsActive = spRuning ;  
   if(threadBD == 0)
     threadBD = new TThreadBD(this,qry,str);
  else  {
  if(threadBD->wait() == false)
 threadBD->terminate();
    
  }
  threadBD->start();
  waitThread();
  
}

void frmMain::waitThread()
{
   while(( threadBD->finished () == false )&&(i<END)) {
                progressbar->setProgress(progressbar->progress ()+1);
                waitCondition.wait(1);
       qApp->processEvents();
}
  if(threadBD->wait() == false){
 threadBD->terminate();
 }
  ProgressIsActive = spStop ;
 [b] mutexReadBd->unlock();[/b]

спасибо.

Записан
Marat(Qt)
Гость
« Ответ #1 : Май 06, 2010, 22:34 »

Зачем Mutex блокировать в основном потоке?
Его надо блокировать в threadBD. Тогда поток, начав выполняться, попытаеться заблокировать Mutex, если он свободен, происходит блокировка и поток продолжает выполняться. Если же предыдущий threadBD еще не разблокировал mutex, то новый поток (запущенный вторым нажатием на кнопку) не сможет заблокировать mutex и будет ждать его освобождения.
Можно блокировать mutex в одном потоке несколько раз, но сколько раз ты его блокируешь, столько раз ты должен его разблокировать. В примере ты блокируешь его только в главном потоке, который всегда один, сколько не блокируй его в одном потоке - никого он держать не будет
Записан
myr
Гость
« Ответ #2 : Май 07, 2010, 09:09 »

Спасибо большое.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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