Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отрезок времени меньше 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 реального времени, а офисная операционка.


Наверх

Титульная страница Поиск, карта сайта Написать письмо