Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.20;
Скачать: CL | DM;

Вниз

Отрезок времени меньше 1 милисекунды   Найти похожие ветки 

 
NOE ©   (2003-02-11 17:22) [0]

Проблема в следующем:
Есть функция, которая генерит уникальную строку которая состоит из даты, и времени с милисекундами. Но в цикле она (функция) вызывается 3-4 раза в милисекунду. Соответственно уникальности никакой :(((.
Как побороть, буду благодарен за подробный пример


 
REA ©   (2003-02-11 17:25) [1]

Во-первых для какой цели нужна строка?
Собственно для получения времени нужен таймер высокого разрешения, которого в системе может и не быть - XP это не OS реального времени, а офисная операционка.


 
MBo ©   (2003-02-11 17:29) [2]

queryperformancecounter


 
NOE ©   (2003-02-11 17:31) [3]

Уникальная строка, как код для записи базы данных. Так как не цифровой, отпадает необходимость перенумерации, проверок и т.д.
Мне на глаза как-то попадался любопытный фрагмент, что-то на счет такта проца или я заврался....


 
Mystic ©   (2003-02-11 17:38) [4]

См. > MBo © (11.02.03 17:29)

Но нет гарантии, что после перезагрузки не вернется это же значение.

Еще можно генерировать GUID.

Можно получить число тактов процессора с момента включения (нужен Pentium).

Можно генерировать число рандомно, и если произошлся ошибка при добавлении записи, менять это число на другое рандомное (можен не всегда прокатить).


 
NOE ©   (2003-02-11 17:41) [5]

Но если queryperformancecounter возвратит ноль то програма загнется на некоторых машинах.

Неужели никто не сталкивался с подобной проблемой при программировании баз? Скажем ДБейс типа (для пресечения попыток посоветовать автоинкремент :)))) )


 
Mystic ©   (2003-02-11 17:46) [6]

На какие грабли ты наступил, что не хочешь пользоваться стандартными средствами?


 
NOE ©   (2003-02-11 17:46) [7]

А что такое, извините за назойливость, GUID и с чем его хавают?

Random с проверкой тоже не подходит, так как я могу проверить и свой "дата+время" который генерится слишком часто.


 
Mystic ©   (2003-02-11 17:51) [8]

> А что такое, извините за назойливость, GUID и с чем его хавают?

Нажми в редакторе Delphi Ctrl+Shift+G и увидишь GUID


 
NOE ©   (2003-02-11 17:54) [9]

Ну не нравится мне парадокс. Не возможно обратится по людски к записи по номеру, есть и др. но главное, есть немало своих функций и процедур, которые 100%-но будуть работать только с ДБФ.

И еще, для строки с кодом Дата+время можно узнать само собой момент добавления записи.

Кстати, какой размер возвратится если запрошу число тактов, проца и как енто сделать?


 
Борис_   (2003-02-11 17:56) [10]

Я тожа один раз страдал такой проблемой (надо было написать генератор случайных чисел)... но я это делал на c++, вообщем тема у меня была такая что каждую милисекунду я запускал цикл от for(i=0;I<1000;i++) и в какой-то момент цикл останавливался... потом дописывал значение i к времени... правда я там пользовался статичными переменными...если покопаюсь может скину сорсик...
хотя я не засекал насколько точно получалось, но попробуй может подойдет...


 
snake1977   (2003-02-11 18:02) [11]

немного запоздало, но....
я генерировал таким же образом уникальный номер как и автор вопроса, и естественно столкнулся с тем же приколом :)
победил только таким образом: при запуске программы запоминал в строке дату и время (например s:="20030211175930")и обнулял внутренний счетчик (глобальная переменная целого типа, например UnicI) , а потом когда нужен был уникальный ID делал ID=s+IntToStr(UnicI); и Inc(UnicI) далее
в итоге получается уникальный номер в пределах каждого запуска программы я думаю LongInt вам должно хватить под номера :)


 
NOE ©   (2003-02-11 18:22) [12]

Спасибо snake1977 это точно поможет, тем более что время с милисекундами. А чтобы размер не разрастался онуляем, если больше 10


 
Романов Р.В. ©   (2003-02-11 19:01) [13]

NOE
Смотрешь текущее время. Если оно меньше или равно времени последнего уникального индекса прибавляешь 1 мс. Запиминаешь это время и т.д.
А на самом деле это делается так.
Создаем таблицу с полем типа Integer. Считываем значение этого поля, увеличиваем на единицу, запоминаем , записываем обратно. То что запомнили и есть уникальный индекс.


 
NOE ©   (2003-02-12 10:08) [14]

Вопрос снимается, решил проблему вставкой задержки в функцию генерации уникального номера

.....
Delay(1);
.....


 
Anatoly Podgoretsky ©   (2003-02-12 10:27) [15]

Проблема решается с переходом на более мелкии единицы, чем миллисекунды, для этого удобнее всего получать номера через процессорные такты, команда RDTSC (asm dw $310f) или как указано выше queryperformancecounter, решение через задержку очень похоже на один метод удаления гланд.



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

Текущий архив: 2003.02.20;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.011 c
14-63793
Г.Каспаров
2003-02-03 17:31
2003.02.20
Ищу кряк к DeepBlue


3-63542
4x4
2003-02-03 16:10
2003.02.20
DBGrid и RowHeight?


6-63725
John
2002-12-27 19:51
2003.02.20
Консоль и TServerSocket


3-63593
Andy Eremin
2003-02-04 12:41
2003.02.20
добавление полей


14-63759
RayRom
2003-02-05 18:53
2003.02.20
MySQL нужна подробная дока по SQL!