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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: ожидание события, потоки  (Прочитано 16749 раз)
boriska
Гость
« : Декабрь 11, 2012, 11:18 »

здрасте, пишу программу под линукс с помощью qt.
подскажите аналог WinApi функции WaitForSingleOject().
дело в том, что есть два не-GUI потока, которые крутятся в бесконечном цикле.
поток №2 перед началом выполнению очередного цикла должен дождаться сигнала от потока №1.
на windows это было реализовано с помощью событий
Записан
ssoft
Гость
« Ответ #1 : Декабрь 11, 2012, 11:24 »

Использовать общий QMutex.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Декабрь 11, 2012, 11:40 »

Цитировать
здрасте, пишу программу под линукс с помощью qt.
подскажите аналог WinApi функции WaitForSingleOject().
o_O лолчто? Ты хоть определись и конкретизируй ОС, а то на ЛОР-е ты не написал.

А так - QWaitCondition тебе уже на ЛОР-е подсказали. См. Qt-шные примеры.
Записан

ArchLinux x86_64 / Win10 64 bit
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Декабрь 11, 2012, 11:50 »

А так - QWaitCondition тебе уже на ЛОР-е подсказали.
QWaitCondition может "вынести моск". Для того что рассказал автор темы хорош QSemaphore
Записан
twp
Гость
« Ответ #4 : Декабрь 11, 2012, 20:57 »

подскажите аналог WinApi функции WaitForSingleObject().
а с каким дескриптором используется WaitForSingleObject()?
Она может использоваться как с потоком так и с мютексом.
тогда соответсвенно нужно смотреть на классы QThread и QMutex, а может и QWaitCondition
Записан
Bepec
Гость
« Ответ #5 : Декабрь 11, 2012, 22:41 »

QWaitCondition выносит мозг. Согласен с этим Улыбающийся
Записан
Dancing_on_water
Гость
« Ответ #6 : Декабрь 14, 2012, 21:01 »

Если время исполнение кода, который исполняется во втором потоке, после приема сигнала с первого, невелико, то пользовать QMutex (самый простой вариант в случае двух потоков).
Если время исполнения невелико как в первым, так и втором потоке,  то лучше смотреть в сторону QAtomicInt и QAtomicPointer и юзать неблокирующую синхронизацию.
 
Если исполняемый код большой, то лучше делать через синалы-слоты.
Пользовать семафор надо лишь в случае 3 и более потоков.

Короче, нужна конкретика.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Декабрь 14, 2012, 21:22 »

Короче, нужна конкретика.
Хорошо, вот простейшая задачка что соответствует изложенной в посте 1

- одна нитка ждет символ с клавиатуры (напр getchar), а другая этот символ печатает (напр printf)

Ваше решение?
Записан
Dancing_on_water
Гость
« Ответ #8 : Декабрь 14, 2012, 21:32 »

Запихнул в один поток, оверхед на синхронизацию слишком велик.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Декабрь 14, 2012, 21:41 »

Запихнул в один поток, оверхед на синхронизацию слишком велик.
А у Вас нет выбора что куда пихать - нитка 1 умеет только читать, нитка 2 - только печатать. Да и сказки про ужасный оверхед рассказывать не стоит  Улыбающийся
Записан
Dancing_on_water
Гость
« Ответ #10 : Декабрь 14, 2012, 22:06 »

Сферически дурацкие задачи не решаю.
А оверхед для этой задачи жуткий: как не делай, но уже самое ожидания потока на выдачу займет больше процессорного времени, чем исполнение команды.
(это если предположить, что у нас на все про все есть один конвеер или раскидывание потоков по конвеерам мы не занимеамся)
Конечно, если предположить, что у нас уже есть два конвеера, и на одном сидит один поток и на другом другой. то стоит смотреть на неблокирующую синхронизацию си атомические типы.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Декабрь 14, 2012, 22:48 »

Сферически дурацкие задачи не решаю.
А оверхед для этой задачи жуткий: как не делай, но уже самое ожидания потока на выдачу займет больше процессорного времени, чем исполнение команды.
(это если предположить, что у нас на все про все есть один конвеер или раскидывание потоков по конвеерам мы не занимеамся)
Конечно, если предположить, что у нас уже есть два конвеера, и на одном сидит один поток и на другом другой. то стоит смотреть на неблокирующую синхронизацию си атомические типы.
Ой наплели "с три короба" - вместо того чтобы написать неск строк кода Улыбающийся  А atomic здесь вообще "як собацi п'ята лапа"  Улыбающийся
Записан
Dancing_on_water
Гость
« Ответ #12 : Декабрь 15, 2012, 08:06 »

Троллинг жирный, тоньше надо, тоньше.

Задача постановлена в терминах "а допустим". И ответ дан в том же ключе.

Насчет атомиков: а давно вы смотрели код синхронизирующих примитивов в qt? или код контейнеров?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Декабрь 15, 2012, 12:06 »

Задача постановлена в терминах "а допустим". И ответ дан в том же ключе.
Насчет ответа - то да. А вопрос был вполне нормальный
есть два не-GUI потока, которые крутятся в бесконечном цикле.
поток №2 перед началом выполнению очередного цикла должен дождаться сигнала от потока №1.
Вот простой способ это сделать
Код
C++ (Qt)
// thread 2
while (true) {
theSemaphore.acquire();
...
}
 
// thread 1
..
theSemaphore.release();
 
Конечно это не единственное решение, но в упор не вижу как это сделать на QMutex и причем тут atomic(и)  Непонимающий
Записан
Dancing_on_water
Гость
« Ответ #14 : Декабрь 15, 2012, 12:42 »

Да, насчет QMutex это я сказанул (конструкции придумал, но вот где они могут быть использованы не понятно). Нужно юзать QWaitCondition.

А с атомиками можно придумать что-то типа такого:

Код:
глобально:
QAtomicInt buffer;

поток 1:

char tmp;

char = getchar();

buffer.fetchAndStoreOrdered(tmp);

поток 2:

while(1)
{
  if(buffer != -257)
  {
   std::cout<<buffer;
   buffer.fetchAndStoreOrdered(-257);
  }
}
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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