Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-63532
Гость
2003-02-01 17:20
2003.02.20
Восстановление удалённых записей


6-63709
MadGhost
2002-12-31 17:06
2003.02.20
Пул, коннектов.


1-63651
vasilly
2003-02-11 19:48
2003.02.20
Как в рантайме заменить один комп. на другой с таким же именем?


9-63466
Mr.Kirya
2002-09-12 21:58
2003.02.20
DxPlay (пересылка файлов)


1-63643
Кило
2003-02-11 10:00
2003.02.20
Как сделать часть надписи Bold-ом?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский