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

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

Страниц: 1 ... 3 4 [5] 6   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Помогите с задачей производителя/потребителя  (Прочитано 37235 раз)
Bepec
Гость
« Ответ #60 : Март 03, 2012, 11:46 »

Так же очень здорово помогает в конструкциях типо
Код:
QMutexLocker locker(&lock);
if (**)
{
   i++;
//если бы был просто мутекс, ты бы должен был вызвать тут unlock() - 1 раз
   return;
}

if (***)
{
  j++;
//если бы был просто мутекс, ты бы должен был вызвать тут unlock() - 2 раз
  return;
}

if(****)
{
  x++;
//если бы был просто мутекс, ты бы должен был вызвать тут unlock() - 3 раза
  return;
}
//если бы был просто мутекс, ты бы должен был вызвать тут unlock() - 4 раза
return;

Вместо 4 строк, о которых можно забыть, есть только 1 класс Подмигивающий


toBRE: если несложно, то можешь почитать о создании плагина к дизайнеру в ассистанте Подмигивающий Qt служит для закрытия от программиста внутренних механизмов. А ты начинаешь всё раскапывать, углубляясь в далёёёкие дебри своего незнания(безрезультатного Подмигивающий).
Записан
lolbla2
Гость
« Ответ #61 : Март 03, 2012, 11:47 »

Код:
void send
{
QMutexLock h(&mutex);
// создаётся мутекс локер и автоматически выполняет ф-цию mutex.lock()
//тут выполняется программа.


}// а вот тут уничтожаются локальные объекты. QMutexLock вызывает деструктор, в котором вызывается ф-ция mutex.unlock()

Тут не бой. Тут попытка выкоежиться у BRE. Уже была один раз, но к сожалению он провалил её, убежав с поля боя Подмигивающий

Получается можно без него обойтись ? странный класс, по-моему программист должен быть просто внимателен и можно обойтись без него
Записан
Bepec
Гость
« Ответ #62 : Март 03, 2012, 11:53 »

Я тебе уже привёл пример. Там где вместо 5 строк можно обойтись одной Подмигивающий

Это ммм... более удобный класс. Так же, как std::string и QString. Почти одно и то же, но второй удобнее Подмигивающий
Записан
mutineer
Гость
« Ответ #63 : Март 03, 2012, 12:21 »

Получается можно без него обойтись ? странный класс, по-моему программист должен быть просто внимателен и можно обойтись без него

Цена ошибки неразблокировки мьютекса может быть очень высока и отловить ее не всегда легко. Почему бы не использовать этот класс, чтобы снизить вероятность ее возникновения?
Записан
lolbla2
Гость
« Ответ #64 : Март 03, 2012, 12:30 »

Я тебе уже привёл пример. Там где вместо 5 строк можно обойтись одной Подмигивающий

Это ммм... более удобный класс. Так же, как std::string и QString. Почти одно и то же, но второй удобнее Подмигивающий

Как заблокировать я понял, просто в конструктор мьютекс передаём, а как при помощи QMutexLocker разблокирует мьютекс?
Записан
mutineer
Гость
« Ответ #65 : Март 03, 2012, 12:33 »

Я тебе уже привёл пример. Там где вместо 5 строк можно обойтись одной Подмигивающий

Это ммм... более удобный класс. Так же, как std::string и QString. Почти одно и то же, но второй удобнее Подмигивающий

Как заблокировать я понял, просто в конструктор мьютекс передаём, а как при помощи QMutexLocker разблокирует мьютекс?

Разблокирует когда уничтожается, то бишь в деструкторе
Записан
lolbla2
Гость
« Ответ #66 : Март 03, 2012, 14:04 »

Я тебе уже привёл пример. Там где вместо 5 строк можно обойтись одной Подмигивающий

Это ммм... более удобный класс. Так же, как std::string и QString. Почти одно и то же, но второй удобнее Подмигивающий

Как заблокировать я понял, просто в конструктор мьютекс передаём, а как при помощи QMutexLocker разблокирует мьютекс?

Разблокирует когда уничтожается, то бишь в деструкторе

Ну тогда мне кое-что не понятно, вот пример что не понятно:
Код
C++ (Qt)
void run()
{
   while(true)
  {
     QMutexlocker locker(&mutex) //заблокировали
   buffer = "xz";  // выполняем чото критичное
    //выполнили а теперь хочу разблокироть и как быть,  locker уничтожится только по окончанию цикла, а цикл никогда не кончится, значит не разблокируемся, что делать?  
   }
}
Записан
BRE
Гость
« Ответ #67 : Март 03, 2012, 14:06 »

Код
C++ (Qt)
void run()
{
   while(true)
   {
       {
           QMutexlocker locker(&mutex) //заблокировали
           // выполняем чото критичное
        }
    //а теперь хочу разблокироть и как быть,  locker уничтожится только по окончанию цикла, а цикл никогда не кончится, значит не разблокируемся, что делать?  
}
Записан
mutineer
Гость
« Ответ #68 : Март 03, 2012, 14:08 »

Ну тогда мне кое-что не понятно, вот пример что не понятно:
Код
C++ (Qt)
void run()
{
   while(true)
  {
     QMutexlocker locker(&mutex)
   buffer = "xz";  
   }
}

Локер будет создавать в начале каждой итерации цикла и уничтожаться в конце каждой итерации
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #69 : Март 03, 2012, 14:19 »

Спасибо конечно, но что у тебя что у Viktor'a одинаково у вас, сообщения отправляет производитель и потребитель мгновенно принимает, ничего никогда не теряется.
Неправда, понажимайте кнопку чуть быстрее, Вы увидите что теряются

P.S. задание чуток изменилось:

теперь надо чтобы сообщение не терялись.

поток 1-> по нажатию кнопки создаёт сообщения. кладёт в очередь. И если поток 2 готов принять сообщение, то берёт из очереди и отправляет.

поток 2-> ждёт каждые 2 секунды просматривает буфер. Если там чото есть считывает ( то есть этот поток моделирует некое устройство, которое способно только каждые 2 сек считывать). Пока поток 2 ждёт, поток 1 не должен в буфер ничего класть.
Если "нельзя класть пока consumer ждет" - то consumer не дождется никогда. Поэтому наверное правильно "producer не должен класть новое сообщение если consumer еще не забрал предыдущее". Тогда attach
Записан
lolbla2
Гость
« Ответ #70 : Март 03, 2012, 14:37 »

Спасибо конечно, но что у тебя что у Viktor'a одинаково у вас, сообщения отправляет производитель и потребитель мгновенно принимает, ничего никогда не теряется.
Неправда, понажимайте кнопку чуть быстрее, Вы увидите что теряются

P.S. задание чуток изменилось:

теперь надо чтобы сообщение не терялись.

поток 1-> по нажатию кнопки создаёт сообщения. кладёт в очередь. И если поток 2 готов принять сообщение, то берёт из очереди и отправляет.

поток 2-> ждёт каждые 2 секунды просматривает буфер. Если там чото есть считывает ( то есть этот поток моделирует некое устройство, которое способно только каждые 2 сек считывать). Пока поток 2 ждёт, поток 1 не должен в буфер ничего класть.
Если "нельзя класть пока consumer ждет" - то consumer не дождется никогда. Поэтому наверное правильно "producer не должен класть новое сообщение если consumer еще не забрал предыдущее". Тогда attach

Большое спасибо, теперь это именно то, что нужно, только в буффере не должно быть больше одного символа, надо по 1 символу по нажатию кнопки класть, ну это сам как-нибудь подправлю.
Записан
lolbla2
Гость
« Ответ #71 : Март 03, 2012, 14:40 »

Ну тогда мне кое-что не понятно, вот пример что не понятно:
Код
C++ (Qt)
void run()
{
   while(true)
  {
     QMutexlocker locker(&mutex)
   buffer = "xz";  
   }
}

Локер будет создавать в начале каждой итерации цикла и уничтожаться в конце каждой итерации

Хорошо, я скосячил, тогда немного другой пример:

Код
C++ (Qt)
void run()
{
 
   QMutexlocker locker(&mutex) // заблокировали
   buffer = "xz";  
   //здесь нужно разблокировать
  //какой-то другой код
 
}

локер сдохнет только по окончанию run(), а мне надо после buffer = "xz";  разблочить. Как это сделать?
Записан
mutineer
Гость
« Ответ #72 : Март 03, 2012, 14:42 »

Либо как сказал BRE, либо не использовать локер, а работать с мьютексом напрямую

Ах да, есть еще самый безумный и невозможный вариант - прочитать-таки доку по QMutexLocker и с удивлением обнаружить там метод unlock()
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #73 : Март 03, 2012, 14:45 »

Код
C++ (Qt)
void run()
{
 
   QMutexlocker locker(&mutex) // заблокировали
   buffer = "xz";  
   //здесь нужно разблокировать
  //какой-то другой код
 
}
локер сдохнет только по окончанию run(), а мне надо после buffer = "xz";  разблочить. Как это сделать?
Код
C++ (Qt)
void run()
{
 if (1) {  
   QMutexlocker locker(&mutex) // заблокировали
   buffer = "xz";  
 }
 ...  // мутекс  разблокирован
}
}
Улыбающийся Вообще это называется "scoped"
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #74 : Март 03, 2012, 14:47 »

Большое спасибо, теперь это именно то, что нужно, только в буффере не должно быть больше одного символа, надо по 1 символу по нажатию кнопки класть, ну это сам как-нибудь подправлю.
Там константы есть, установите обе в 1
Записан
Страниц: 1 ... 3 4 [5] 6   Вверх
  Печать  
 
Перейти в:  


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