Форум: "Основная";
Текущий архив: 2003.02.20;
Скачать: [xml.tar.bz2];
ВнизОтрезок времени меньше 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c