Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2016, 19:17   #1
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию SetEvent + WaitForSingleObject

Есть ли гарантия, что WaitForSingleObject успеет сработать, если другой поток сделает SetEvent и CloseHandle подряд?
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 22.09.2016, 19:23   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а зачем стрелять себе в ногу?

мне кажется в момент SetEvent потоки/поток будут помечены на исполнение.
вообще в любом случае выход у вас будет, как минимум потому что объект перестанет существовать =D
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.09.2016, 19:45   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Нет, прямым текстом написано:
Цитата:
If this handle is closed while the wait is still pending, the function's behavior is undefined.
waleri вне форума Ответить с цитированием
Старый 22.09.2016, 19:48   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Нет, прямым текстом написано:
тут нюанс что сначала идет SetEvent, лишь после CloseHandle, то есть потоки могут успеть выйти из ожидания.

но вопрос про выстрел в ногу актуален.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.09.2016, 19:50   #5
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а зачем стрелять себе в ногу?

мне кажется в момент SetEvent потоки/поток будут помечены на исполнение.
вообще в любом случае выход у вас будет, как минимум потому что объект перестанет существовать =D
Так, мне Event и нужен только для того, чтобы освободить от ожидания другие потоки. Что ж мне, сделать SetEvent и оставить его плавать в недрах?

Цитата:
Сообщение от waleri Посмотреть сообщение
Нет, прямым текстом написано:
И что? Я же не собираюсь его закрывать до установки SetEvent. Я это буду делать после.
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 22.09.2016, 19:54   #6
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

И ещё вопрос: каких значений не бывает у хэндла (кроме 0)?
Ну, например, 1 или -1.
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 22.09.2016, 19:58   #7
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Есть ли гарантия, что WaitForSingleObject успеет сработать, если другой поток сделает SetEvent и CloseHandle подряд?
Гарантий нет.

Из MSDN.
If the time-out interval is greater than one tick but less than two, the wait can be anywhere between one and two ticks, and so on.

Может между тиками системного таймера так и на границе.


Цитата:
SetEvent и CloseHandle подряд?
Виндоус эта система с вытесняющей многозадачностью. Это значит, что поток может быть прерван в любой момент. В том числе и между этими двумя функциями.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 22.09.2016, 20:03   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
И ещё вопрос: каких значений не бывает у хэндла (кроме 0)?
Ну, например, 1 или -1.
проверяйте на документированное значение в момент получение хэндла.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.09.2016, 20:14   #9
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
И ещё вопрос: каких значений не бывает у хэндла (кроме 0)?
Ну, например, 1 или -1.
Все бывают. В том числе и 0.
К примеру GetDC(0).
handle - это обработчик. "Обработчик" синоним к слову "рабочий". Применяется для сокрытия реализации. В двух словах не объясню.
Суть в том что можно рассматривать как номер виртуальной функции в некоторой таблице или массиве или case of (switch of).
При этом в GetDC - это свои номера, в WaitForSingleObject свои номера у них разные таблицы.

Для наведения порядка макрософт ввела понятия объект ядра. Только вот ещё больше запутала. Вот объекты ядра работают с хенделовыми номерами адресующих к общему массиву, общей таблице.

Объекты ядра:
https://msdn.microsoft.com/ru-ru/lib...(v=vs.85).aspx
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 22.09.2016 в 20:20.
Pavia вне форума Ответить с цитированием
Старый 22.09.2016, 20:17   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

HDC это хэндл другой подсистемы, естественно там свои порядки.
Цитата:
Для наведения порядка макрософт ввела понятия объект ядра.
оно там с самого начала.
никаких номеров функций там нет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TThread и WaitForSingleObject xrob Общие вопросы Delphi 4 20.04.2014 14:13
Не срабатывает waitforsingleobject peeper Общие вопросы Delphi 2 28.11.2013 16:10
Многопоточность showmodal и WaitForSingleObject bulldog5293 Общие вопросы Delphi 24 24.01.2011 18:46
WaitForSingleObject besserebrenik Win Api 3 15.02.2010 22:40
WaitForSingleObject в Delphi 2009 Хамяг Win Api 11 03.12.2009 09:06