![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отрезок времени меньше 1 милисекунды [D5, Win2k, WinXP]
NOE © (2003-02-11 17:22:00)Проблема в следующем:
Есть функция, которая генерит уникальную строку которая состоит из даты, и времени с милисекундами. Но в цикле она (функция) вызывается 3-4 раза в милисекунду. Соответственно уникальности никакой :(((.
Как побороть, буду благодарен за подробный пример
Anatoly Podgoretsky (2003-02-12 10:27:00) [1]Проблема решается с переходом на более мелкии единицы, чем миллисекунды, для этого удобнее всего получать номера через процессорные такты, команда RDTSC (asm dw $310f) или как указано выше queryperformancecounter, решение через задержку очень похоже на один метод удаления гланд.
NOE (2003-02-12 10:08:00) [2]Вопрос снимается, решил проблему вставкой задержки в функцию генерации уникального номера
.....
Delay(1);
.....
Романов Р.В. (2003-02-11 19:01:00) [3]NOE
Смотрешь текущее время. Если оно меньше или равно времени последнего уникального индекса прибавляешь 1 мс. Запиминаешь это время и т.д.
А на самом деле это делается так.
Создаем таблицу с полем типа Integer. Считываем значение этого поля, увеличиваем на единицу, запоминаем , записываем обратно. То что запомнили и есть уникальный индекс.
NOE (2003-02-11 18:22:00) [4]Спасибо snake1977 это точно поможет, тем более что время с милисекундами. А чтобы размер не разрастался онуляем, если больше 10
snake1977 (2003-02-11 18:02:00) [5]немного запоздало, но....
я генерировал таким же образом уникальный номер как и автор вопроса, и естественно столкнулся с тем же приколом :)
победил только таким образом: при запуске программы запоминал в строке дату и время (например s:="20030211175930")и обнулял внутренний счетчик (глобальная переменная целого типа, например UnicI) , а потом когда нужен был уникальный ID делал ID=s+IntToStr(UnicI); и Inc(UnicI) далее
в итоге получается уникальный номер в пределах каждого запуска программы я думаю LongInt вам должно хватить под номера :)
Борис_ (2003-02-11 17:56:00) [6]Я тожа один раз страдал такой проблемой (надо было написать генератор случайных чисел)... но я это делал на c++, вообщем тема у меня была такая что каждую милисекунду я запускал цикл от for(i=0;I<1000;i++) и в какой-то момент цикл останавливался... потом дописывал значение i к времени... правда я там пользовался статичными переменными...если покопаюсь может скину сорсик...
хотя я не засекал насколько точно получалось, но попробуй может подойдет...
NOE (2003-02-11 17:54:00) [7]Ну не нравится мне парадокс. Не возможно обратится по людски к записи по номеру, есть и др. но главное, есть немало своих функций и процедур, которые 100%-но будуть работать только с ДБФ.
И еще, для строки с кодом Дата+время можно узнать само собой момент добавления записи.
Кстати, какой размер возвратится если запрошу число тактов, проца и как енто сделать?
Mystic (2003-02-11 17:51:00) [8]> А что такое, извините за назойливость, GUID и с чем его хавают?
Нажми в редакторе Delphi Ctrl+Shift+G и увидишь GUID
Mystic (2003-02-11 17:46:00) [9]На какие грабли ты наступил, что не хочешь пользоваться стандартными средствами?
NOE (2003-02-11 17:46:00) [10]А что такое, извините за назойливость, GUID и с чем его хавают?
Random с проверкой тоже не подходит, так как я могу проверить и свой "дата+время" который генерится слишком часто.
NOE (2003-02-11 17:41:00) [11]Но если queryperformancecounter возвратит ноль то програма загнется на некоторых машинах.
Неужели никто не сталкивался с подобной проблемой при программировании баз? Скажем ДБейс типа (для пресечения попыток посоветовать автоинкремент :)))) )
Mystic (2003-02-11 17:38:00) [12]См. > MBo © (11.02.03 17:29)
Но нет гарантии, что после перезагрузки не вернется это же значение.
Еще можно генерировать GUID.
Можно получить число тактов процессора с момента включения (нужен Pentium).
Можно генерировать число рандомно, и если произошлся ошибка при добавлении записи, менять это число на другое рандомное (можен не всегда прокатить).
NOE (2003-02-11 17:31:00) [13]Уникальная строка, как код для записи базы данных. Так как не цифровой, отпадает необходимость перенумерации, проверок и т.д.
Мне на глаза как-то попадался любопытный фрагмент, что-то на счет такта проца или я заврался....
MBo (2003-02-11 17:29:00) [14]queryperformancecounter
REA (2003-02-11 17:25:00) [15]Во-первых для какой цели нужна строка?
Собственно для получения времени нужен таймер высокого разрешения, которого в системе может и не быть - XP это не OS реального времени, а офисная операционка.