Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Альтернатива GetTickCount   Найти похожие ветки 

 
DVM ©   (2012-03-14 23:03) [40]


> antonn ©   (14.03.12 22:32) [38]


> для чего? сабж возвращает время прошедшее со старта системы,
>  а предложенное?

сабж может и возвращает, но сабж применяется для организации ожидания в паре с циклом и просыпаниями через определенные интервалы времени.

WaitableTimer позволяет выставить таймер с любым интервалом, хоть 100 лет. WaitForXXX позволяют ждать срабатывания таймера хоть вечно + параллельно ждать сколько угодно событий таких как завершение потока и т.д. Крутить циклы со всякими GetTickCount, Sleep и т.д. расточительно и не правильно.


 
antonn ©   (2012-03-14 23:24) [41]


> сабж может и возвращает, но сабж применяется для организации
> ожидания в паре с циклом и просыпаниями через определенные
> интервалы времени.

я понял свою ошибку - я не сказал сразу что сабж в уже готовом проекте применяется не только так, как сказано в цитате...
перегрузка функции была бы (D7) - перегрузил, а так пришлось бы сооружать то, что выше есть в этой теме.


 
Sha ©   (2012-03-14 23:35) [42]

> antonn ©   (14.03.12 23:24) [41]

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


 
antonn ©   (2012-03-15 00:19) [43]


> во всех таких местах просто используй дворды для моментов
> времени,
> а нужное время ожидания сравнивай с их разностью,
> все будет работать.

там и так все переменные втянутые в работу с сабжем в dword, мест много, после 49 дней разность будет немного не такая как ожидалось. Плюс используется результат GetTickCount, а не его разность (используется аналогично времени в unixtime). Вот потому и задавался вопросом как бы "перегрузить" GetTickCount чтобы возвращал в int64 (например) результат.


 
Sha ©   (2012-03-15 00:23) [44]

ничего не понимаю


 
antonn ©   (2012-03-15 00:27) [45]

GetTickCount использовался и как метка времени, в целочисленном формате с достаточной точностью (десятые секунды), не только в операциях сравнения "таймеров". И после 49 дней эта метка будет переполнена и начинаться заново.


 
Sha ©   (2012-03-15 00:29) [46]

И зачем нужно помнить старую метку 49-дневной тухлости?


 
antonn ©   (2012-03-15 00:32) [47]


> И зачем нужно помнить старую метку 49-дневной тухлости?

переформулируй
один раз вызвали GetTickCount на 49-й день, второй раз на 50-й, какая будет разница м/у метками времени?


 
Sha ©   (2012-03-15 00:35) [48]

1 день, разумеется
Какая разница, что хранится в метках, если разница правильная.

Пример - вокзальные часы.
Они "переполняются", но время перекура позволяют измерить.


 
antonn ©   (2012-03-15 00:45) [49]


> Они "переполняются", но время перекура позволяют измерить.

до тех пор пока разница не вычисляется путем отнимания значения первой метки от второй?


 
Sha ©   (2012-03-15 00:49) [50]

В нашем измерении разница всегда вычисляется путем вычитания старого замера из нового.


 
antonn ©   (2012-03-15 00:52) [51]

понятно.
жаль что я всегда натыкаюсь не на "ваше", и приходится наблюдать вычитание нового из старого: 25032704-4233600000 (50 дней минус 49 дней)


 
antonn ©   (2012-03-15 00:53) [52]

тьфу ты, из нового старое =)
пример с цифрами тот же


 
Германн ©   (2012-03-15 00:55) [53]


> до тех пор пока разница не вычисляется путем отнимания значения
> первой метки от второй?

До тех пор, пока вычитание выполняется бездумно. Если разница считается по крайней мере один раз каждые 49.7 суток никаких проблем быть не может.


 
antonn ©   (2012-03-15 00:59) [54]


> До тех пор, пока вычитание выполняется бездумно.

это очень важный и информативный ответ.


 
Sha ©   (2012-03-15 01:03) [55]

Во ты заморочил сам себе голову.
Старый замер - тот что был сделан до нового, их значения могут быть любыми.


procedure TForm1.Button1Click(Sender: TObject);
var
 dw1, dw2, dw: dword;
begin
 dw1:=25032704;     Memo1.Lines.Add(IntToStr(dw1));
 dw2:=4233600000;   Memo1.Lines.Add(IntToStr(dw2));
 dw:=dw1-dw2;       Memo1.Lines.Add(IntToStr(dw));
end;


Результат


25032704
4233600000
86400000


А в вашем измерении иначе?


 
antonn ©   (2012-03-15 01:07) [56]

у меня типы разные, с бОльшей "разрешающей способностью", пока до разницы дойдет


 
Sha ©   (2012-03-15 01:07) [57]

> antonn

В моем примере несколько неудачно выбраны имена переменных.
Ты конечно, понял, что замер dw1 сделан после замера dw2.


 
Sha ©   (2012-03-15 01:08) [58]

> у меня типы разные, с бОльшей "разрешающей способностью", пока до разницы дойдет

НАФИГА????


 
antonn ©   (2012-03-15 01:09) [59]

что "нафига"?


 
Германн ©   (2012-03-15 01:10) [60]


> antonn ©   (15.03.12 00:59) [54]
>
>
> > До тех пор, пока вычитание выполняется бездумно.
>
> это очень важный и информативный ответ.
>

Дык ведь уже дали туеву хучу примеров правильного вычитания! Последний пример в pasha_golub ©   (14.03.12 18:24) [35]. Дополнительная информация о частоте вычислений этой разности в моём ответе.

Какая ещё информативность тебе требуется?


 
Sha ©   (2012-03-15 01:10) [61]

НАФИГА ЭТО

типы разные, с бОльшей "разрешающей способностью"


 
antonn ©   (2012-03-15 01:11) [62]


> Какая ещё информативность тебе требуется?

Лично мне не нужны ответы в стиле "код должен быть продуман". Это и так все знают.
Ну может кому нибудь такие ответы нужны, потому не буду говорить тебе "не пиши их" :)


> Sha ©   (15.03.12 01:10) [61]
>
> НАФИГА ЭТО

sql


 
Германн ©   (2012-03-15 01:14) [63]


> antonn ©   (15.03.12 01:11) [62]
>
>
> > Какая ещё информативность тебе требуется?
>
> Лично мне не нужны ответы в стиле "код должен быть продуман".
>  Это и так все знают.

Типичный ответ троешника.
Ты автор вопроса?


 
Sha ©   (2012-03-15 01:17) [64]

> Германн ©   (15.03.12 01:10) [60]
> Дык ведь уже дали туеву хучу примеров правильного вычитания! Последний пример в pasha_golub ©   (14.03.12 18:24) [35].

Это как раз пример неправильного вычитания по двум причинам:
1. сильно смахивает на всеми любимый IncDay.
2. при переходе через 0 он ошибается на 1ms.

Правильное вычитание только одно: C=A-B, и нефиг городить огород.


 
antonn ©   (2012-03-15 01:18) [65]


> Sha ©  

изначально я искал возможность в готовом проекте "подменить" GetTickCount который бы выдавал int64. В пхп можно было перегрузить, и в своей функции сделать костыляку наподобии [35] (собственно там она и есть).
Т.к. временнЫе метки использовались в вычислениях "много-где" (именно по этому не подходил вариант с переделкой "таймеров", подгонов типов), тип для хранения метки везде int64, и только сам источник такой метки отдает dword.


 
Sha ©   (2012-03-15 01:19) [66]

> antonn ©   (15.03.12 01:11) [62]
> sql

не вижу связи одного с другим


 
Sha ©   (2012-03-15 01:20) [67]

> GetTickCount который бы выдавал int64

ну никак не пойму зачем


 
Германн ©   (2012-03-15 01:22) [68]


> Это как раз пример неправильного вычитания по двум причинам:
>
> 1. сильно смахивает на всеми любимый IncDay.
> 2. при переходе через 0 он ошибается на 1ms.

Это просто самый "ближний" пример, который я нашёл колесом мышки.
И что значит, что он "ошибается на 1ms"? С учётом того, что в топике проверка "прошли ли те 5 секунд, которые я задал".


 
Sha ©   (2012-03-15 01:24) [69]

> Германн ©   (15.03.12 01:22) [68]

Да пойми ты, это бред, ярко демонстрирующий,
что автор не в ладах с целочисленной арифметикой.


 
antonn ©   (2012-03-15 01:29) [70]


> ну никак не пойму зачем

если у меня будет завтра желание, если за сегодня никто не поймет и не попробует объяснить, и если ветку не закроют - завтра попытаюсь объяснить (хотя если из [65] не ясно - то даже не знаю есть ли смысл объяснять). А сейчас - спокойной ночи :)


 
Германн ©   (2012-03-15 01:29) [71]


> Sha ©   (15.03.12 01:24) [69]
>
> > Германн ©   (15.03.12 01:22) [68]
>
> Да пойми ты, это бред, ярко демонстрирующий,
> что автор не в ладах с целочисленной арифметикой.

Какого автора ты имеешь в виду? Если Пашу Голубева, то объясни чем автор не в ладах с целочисленной арифметикой?


 
Германн ©   (2012-03-15 01:33) [72]

Паша, извини. Похоже я переврал твою фамилию. :(


 
Sha ©   (2012-03-15 01:40) [73]

> Германн ©   (15.03.12 01:29) [71]

Ну вот тебе более понятный пример.
Есть A и B.
Интегер.  
Надо получить их разность.
Причем заранее известно, что она всегда точно равна A-B.
Ты бы стал писать для этого функцию?
Ты бы стал внутри нее проверять знаки переменных?
Ты бы заложил в нее ошибку, чтобы результат иногда отличался от правильного на 1?
Или просто написал бы C=A-B ?
В сабже все то же самое.


 
Германн ©   (2012-03-15 02:00) [74]


> Sha ©   (15.03.12 01:40) [73]
>
> > Германн ©   (15.03.12 01:29) [71]
>
> Ну вот тебе более понятный пример.
> Есть A и B.
> Интегер.  
> Надо получить их разность.
> Причем заранее известно, что она всегда точно равна A-B.
>
> Ты бы стал писать для этого функцию?

Если переменные типа Integer - не стал бы. Но GetTickCount возвращает DWORD.
Теперь понял, что ты имел в виду.
Но результат вычитания GetTickCount - Start возвращает Integer не глядя на то, что "GetTickCount возвращает DWORD"!


 
Sha ©   (2012-03-15 02:07) [75]

На интегер свет клином сошелся!
Религия запрещает выбирать другие типы!
Даешь программирование без чтения букваря!
Ворнинги не для писателей!


 
Германн ©   (2012-03-15 02:25) [76]


> Sha ©   (15.03.12 02:07) [75]
>
> На интегер свет клином сошелся!
> Религия запрещает выбирать другие типы!

Ты об чём вообще?
Спать!
Рекомендую спать всем, кто не может согласиться с тем, что ему лучше пойти спать, чтобы завтра со свежей головой участвовать на форумах. :)


 
Sha ©   (2012-03-15 02:30) [77]

Эх, жаль Юрий Зотов забросил свой культпросвет.
Арифметика была бы актуальной темой.


 
Германн ©   (2012-03-15 02:44) [78]


> Sha ©   (15.03.12 02:30) [77]
>
> Эх, жаль Юрий Зотов забросил свой культпросвет.
> Арифметика была бы актуальной темой.
>

Не ЮЗ забросил. И арифметика тут не не при чём.


 
Ega23 ©   (2012-03-15 03:07) [79]


> Ты об чём вообще?
> Спать!
> Рекомендую спать всем, кто не может согласиться с тем, что
> ему лучше пойти спать, чтобы завтра со свежей головой участвовать
> на форумах. :)



procedure TForm17.Button1Click(Sender: TObject);
var
 dw1, dw2: DWORD;
begin
 dw1 := $FFFFFFFF;
 dw2 := $00000001;
 Label1.Caption := IntToStr(Cardinal(dw2-dw1));
end;


dw1 - твой GetTickCount перед аптаймом.
dw2 - через 2 миллисекунды (как нетрудно догадаться).
Результат - то, что Sha уже чёрти-сколько постов пытается донести.


 
sniknik ©   (2012-03-15 08:18) [80]

> то, что Sha уже чёрти-сколько постов пытается донести.
он странно "доносит". я вон пытался сказать что тип важен, надо это учитывать, привел примеры, и на это - "нормальный программист ... " т.д. вместо того чтобы прямо написать. т.к. по факту 98% не понимают представления чисел в компе что такое переполнение, и как делается вычитание (когда то нас учили, это было через сложение... может сейчас уже не так).



Страницы: 1 2 3 вся ветка

Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.61 MB
Время: 0.092 c
15-1335422333
Дмитрий С
2012-04-26 10:38
2013.03.22
Кадр из 112 серии интернов.


2-1343940747
MidnightSun
2012-08-03 00:52
2013.03.22
Нуждаюсь в помощи


15-1333612123
Хаус
2012-04-05 11:48
2013.03.22
Нарисовать кнопку в XP-стиле


2-1336031343
igorium
2012-05-03 11:49
2013.03.22
Как узнать язык Windows (русский или нет)


15-1337667020
AV
2012-05-22 10:10
2013.03.22
Oracle/ Надо прибить сессии, использующие пакет





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский