Главная страница
    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.009 c
3-63577
qwerty2
2003-02-04 10:04
2003.02.20
Определить тип полей - результатов запроса


3-63501
denis24
2003-02-05 10:13
2003.02.20
Ttable.Tablename


7-63874
Masya2001
2002-12-22 23:09
2003.02.20
Как сделать не видимыми часы в таск баре???


1-63602
shulc
2003-02-10 18:24
2003.02.20
Оптическая мышь и его волшебное колесо


6-63719
APTEMKA
2003-01-01 16:07
2003.02.20
Какое ИМЯ ПОЛЬЗОВАТЕЛЯ в стандартной звонилке сейчас активно?





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