Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
40 / 3 / 1
Регистрация: 24.11.2012
Сообщений: 261

Можно-ли получить значение таймера из WatForSingleObject ?

11.03.2017, 19:53. Показов 1056. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Попробую пояснить, столь сумбурный заголовок темы.
У меня такой кусок кода (для простоты вопроса сократил лишнее).
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
.........
timeout:= 100;
Repeat
  wEv:= WaitForSingleObject(hObj, timeout);
  case wEv Of
    WAIT_OBJECT_0: if (A = B) then Break else timeout:= ?????;
    WAIT_FAILED: exit;
    WAIT_ABANDONED: exit;
    else Break;
  end;
Until(wEv = WAIT_TIMEOUT);
if (wEv = WAIT_OBJECT_0) then //нормальный код программы
                         else //нехорошая ситуация, отправляем на обработку ошибки
.........
Так вот в случае, помеченным вопросами, я хочу чтобы таймер запустился не опять со значения 100, а с оставшихся до истечения, уже запущенного в самом начале, таймера. Вот как мне узнать, сколько миллисекунд осталось до конца таймера в том месте кода?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.03.2017, 19:53
Ответы с готовыми решениями:

Дано целое двухзначное число a. Получить удвоенное значение наименьшего числа, которое можно получить из цифр заданного числа a
Дано целое двухзначное число a. Получить удвоенное значение наименьшего числа, которое можно получить из цифр заданного числа a. Входные...

Как можно получить значение [price]?
в опенкарте запрос к БД $myPrice = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_option_value WHERE...

Как можно получить значение ячейки DataGridveiw
есть перемена string name; как можно получит значение поле имя из DataGridveiw при нажатие

12
Джоуи
 Аватар для Joey
1083 / 645 / 240
Регистрация: 05.05.2015
Сообщений: 3,559
Записей в блоге: 2
11.03.2017, 20:29
Kuzya69, не нашел, можно ли это узнать. На случай, если никто не ответит на вопрос, скромно предположу (как вариант):
// считываем системное время
wEv:= WaitForSingleObject(hObj, timeout);
// опять считываем системное время - разница между ними и есть прошедшее время таймера.
Правда на таких мелких скоростях, как 100 мс, обращение к системному времени тоже может занять значительное время. Опишу как я сделал. Обычная TimeToStr не возвращает миллисекунды, поэтому использую uses Windows, и винАПИ функцию GetLocalTime:
Delphi
1
2
3
4
5
6
7
8
function FullTime: string; // функция для получения системного
//времени в полном виде - 22:10:51:364
var
  st: TSystemTime;
begin
  GetLocalTime(t);
  result := IntToStr(st.Hour) + ':' + IntToStr(st.Minute) + ':' + IntToStr(st.Second) + ':' + IntToStr(st.Millisecond);
end;
Но в Вашем случае нужно учитывать еще и перескок между секундами, минутами и т.д., например, если до WaitForSingleObject было 59 секунд и, скажем, 998 мс, то после будет уже 00 секунд и несколько миллисекунд, а еще и счетчик минут увеличится. Это все надо учесть вручную.

Но это так, грубый вариант на крайний случай. Прямого решения проблемы я не нашел
0
40 / 3 / 1
Регистрация: 24.11.2012
Сообщений: 261
11.03.2017, 20:35  [ТС]
Примерно таким образом я и сделал, только использовал QueryPerformanceCounter и QueryPerformanceFrequency. Но некрасиво, как-то. Хочется какой-нибудь АПИ готовой сделать.
0
botsik
 Аватар для cfbogd
262 / 262 / 140
Регистрация: 05.06.2016
Сообщений: 1,247
Записей в блоге: 1
11.03.2017, 23:09
Цитата Сообщение от Joey Посмотреть сообщение
Delphi
1
2
3
var st: TSystemTime;
begin
GetLocalTime(t);
опечатка?
0
 Аватар для wendstor
139 / 137 / 66
Регистрация: 15.05.2012
Сообщений: 516
12.03.2017, 01:17
дойдя до WaitForSingleObject управление передаётся хэндлу потока/мьютекса и т.д. на определённое время (которое вы установили вторым параметром) при этом текущий поток приостанавливается.
Цитата Сообщение от Joey Посмотреть сообщение
// считываем системное время
wEv:= WaitForSingleObject(hObj, timeout);
0
40 / 3 / 1
Регистрация: 24.11.2012
Сообщений: 261
12.03.2017, 01:27  [ТС]
Цитата Сообщение от wendstor Посмотреть сообщение
дойдя до WaitForSingleObject передаётся управление хэнлу потока/мьютекса и т.д. на определённое время (которое вы установили вторым параметром) при этом текущий поток приостанавливается.
Да все нормально. Автор имел ввиду
Цитата Сообщение от Joey Посмотреть сообщение
// считываем системное время (перед следующим оператором)
wEv:= WaitForSingleObject(hObj, timeout);
// опять считываем системное время(уже после предыдущего оператора)
В точках, которые помечены у него как "//", текущий поток еще и уже работает.
У меня подобный "костыль" но с другими АПИ работает, но это мне совсем не нравится.
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,608
12.03.2017, 02:29
Цитата Сообщение от Kuzya69 Посмотреть сообщение
Так вот в случае, помеченным вопросами, я хочу чтобы таймер запустился не опять со значения 100, а с оставшихся до истечения, уже запущенного в самом начале, таймера.
А зачем? И о каком таймере идет речь?
0
40 / 3 / 1
Регистрация: 24.11.2012
Сообщений: 261
12.03.2017, 02:37  [ТС]
Что-бы не отсчитывать заданный таймаут заново, а досчитать до конца.

Ну что-то отсчитывает таймаут при выполнении оператора:
wEv:= WaitForSingleObject(hObj, timeout);
Вот я для простоты и назвал его таймером.
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,608
12.03.2017, 03:09
Тогда ещё раз зачем? Зачем в смысле нафига это нужно?
0
Джоуи
 Аватар для Joey
1083 / 645 / 240
Регистрация: 05.05.2015
Сообщений: 3,559
Записей в блоге: 2
12.03.2017, 09:59
Цитата Сообщение от wendstor Посмотреть сообщение
управление передаётся хэндлу потока/мьютекса
системное время не зависит от состояния потока

Цитата Сообщение от Kuzya69 Посмотреть сообщение
но это мне совсем не нравится
Согласен, костыль он и в Африке костыль
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
12.03.2017, 10:36
Kuzya69, а может, тебе больше подойдет CreateWaitableTimer/SetWaitableTimer (WinAPI)?
Например, можно сделать periodic timer, который будет переходить в сигнальное состояние
каждые N секунд/миллисекунд. Т.е. в этом случае не нужно будет самому считывать показания
системного времени и вычислять, сколько времени прошло.
0
40 / 3 / 1
Регистрация: 24.11.2012
Сообщений: 261
12.03.2017, 12:51  [ТС]
Тут смысл такой, я поставил event на появление в буфере приема устройства любых байт, отправил в устройство (в буфер передачи) запрос, и жду ответ. Если ответ пришел быстрее, чем отведенное для этого время (tmeout), то я проверяю ответ на правильность, если неверный, то продолжаю ждать по таймеру, ну а если верный, то обрабатываю. И соответственно не забываю про возможные ошибки. Ну а если таймер сработал, и ответа нет, то занимаюсь другими вычислениями.
0
12.03.2017, 14:44

Не по теме:

Цитата Сообщение от cfbogd Посмотреть сообщение
опечатка
ага(

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.03.2017, 14:44
Помогаю со студенческими работами здесь

Можно ли получить значение или текст с сайта
Можно ли написать программу где указывая URL просходит анализ сайта,может поиск определенного слова его возврат в программу и сохранение в...

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

Можно ли получить значение элемента кортежа полученного с помощью make_tuple
Здравствуйте, есть массив it = make_tuple(i, j, false); Есть ли возможность получить третье значение (false) , зная лишь i и j

Как в консоли можно получить значение нажатой пользователем клавиши
Как в консоли C# можно получить значение нажатой пользователем клавиши, или узнать значение введенной строки? Помню как то 3 года назад...

Как можно получить рандомный элемент массива и записать в него значение ?
Как можно получить рандомный элемент массива и записать в него значение ? Например присвоить текст


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru