|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
28.06.2013, 11:09 | #1 |
Пользователь
Регистрация: 24.12.2012
Сообщений: 82
|
Потоки, синхронизация, простой
Уважаемые форумчане, нужна ваша помощь!
есть вот такая функция для потока: Код:
занимается просмотром событий в очереди и выполнением их, если время настало. если события кончились, останавливает поток, а добавление нового события его снова запустит. а если событие не наступило, его надо подождать. Вопрос в ток как это сделать: если повесить Sleep, тогда при добавлении нового события, которое должно случиться раньше первого(на момент Sleep'а) поток продолжит спать, и выполнится не раньше намеченного времени. а если ничего не сделать цикл будет вхолостую крутиться и подъедать ресурсы, но работать будет правильно. есть какой-нибудь аналог слипа, который можно разбудить? |
28.06.2013, 12:12 | #2 |
Участник клуба
Регистрация: 18.10.2008
Сообщений: 1,409
|
SuspendThread \ ResumeThread
WaitForsingleObject \ WaitForMultipleObjects |
28.06.2013, 13:22 | #3 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
Прочитайте про семафоры.
|
28.06.2013, 16:50 | #4 |
Пользователь
Регистрация: 24.12.2012
Сообщений: 82
|
если я заюзаю SuspendThread:
если за время простоя добавится новое событие в начало очереди, то все ок. но если события не добавится, кто разбудит поток во время наступления первого события? WaitForSingleObject я не могу использовать, это не библиотечный Event, а мой, самописный, в нем содержится только время, когда он должен быть выполнен. ======================= есть вариант Sleep(50) ,например. будет проверять каждые 50 миллисекунд, все лучше чем постоянно крутиться. и все же хотелось бы что-то вроде SuspendThread, только еще с параметром времени, как в WaitForSingleObject, но как это сделать, я пока не знаю Последний раз редактировалось denrubun; 28.06.2013 в 16:52. |
28.06.2013, 18:26 | #5 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
Каждый, кто добавит в очередь будет вызвать ResumeThread(), после извлечения и выполнения каждого елемента из очереди рабочий поток будет вызывать SuspendThread(). При создании рабочега потока сразу вызываем SuspendThread() (или прямо создаем поток спящим).
Одно непонятно - зачем изобретать колесо а не прочитать про семафоры? Далее, почему нельзя использовать WaitForSingleObject но можно использоват ResumeThread, Sleep, etc? Зачем вообще нужен параметр времени? Это когда используем Sleep, только Sleep очень вредная функция... |
29.06.2013, 10:06 | #6 | |||
Пользователь
Регистрация: 24.12.2012
Сообщений: 82
|
Цитата:
Цитата:
Или вы предлагаете дополнить/заменить его? Мой класс Event является базовым для всех событий в игре, он никак не связан с библиотечным, вообще никак. Код:
Цитата:
из вики: Код:
|
|||
29.06.2013, 10:32 | #7 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
Мне по барабану.
Ожидание делается через функции ожидания - WaitForSingleObject() о чем вам сказали в первом же ответе. CreateEvent(), SetEvent(), WaitForSingleObject() - для одного потока этого вполне достаточно. Если надо несколько рабочих потоков (что лучше) то лучше использовать семафоры. Нет, можно сделать тем же SetEvent() но надо будет изобретать велосипед. |
29.06.2013, 10:54 | #8 |
Пользователь
Регистрация: 24.12.2012
Сообщений: 82
|
т.е. мне нужно создать событие с помощью CreateEvent() и повесить ожидание этого события с помощью WaitForSingleObject().
тогда нужно в нужное время чтобы это событие отсигналило и ожидание прекратилось. т.е. таки прикрутить к этому еще таймер? |
29.06.2013, 11:05 | #9 | |
Участник клуба
Регистрация: 18.10.2008
Сообщений: 1,409
|
Цитата:
К тому же можно в Wait-функцию передать дескриптор вашего объекта, после его разрушения функция вернет управление. Еще есть такие вещи как таймеры ожидания и условные переменные: Waitable Timer Condition Variables |
|
29.06.2013, 11:16 | #10 |
Пользователь
Регистрация: 24.12.2012
Сообщений: 82
|
Спасибо, думаю вопрос решен!
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
синхронизация | s.e.r.g. | C++ Builder | 10 | 11.02.2013 22:33 |
Синхронизация БД | Bright-rider | БД в Delphi | 3 | 19.06.2012 07:32 |
Синхронизация | tesseract | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 2 | 20.03.2012 10:31 |
Синхронизация | kostyan142 | Общие вопросы по Java, Java SE, Kotlin | 6 | 13.01.2010 01:39 |
Синхронизация | yarilo | Софт | 2 | 07.08.2009 15:50 |