:: Visual Foxpro, Foxpro for DOS
Чтение параметров ОС
Vedmak

Сообщений: 5949
Откуда: CiTY
Дата регистрации: 30.10.2003
Как работает GETENV()? Имеет ли смысл однократно себе параметр забирать в приложение при запуске или функция достаточно быстра и "экономить на спичках" смысла нет?

Например:

function os_user_name
return GETENV("UserName")
endfunc


------------------
Говорить стоит лишь для тех, кто слушает.
Ratings: 0 negative/0 positive
Re: Чтение параметров ОС
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Альтернативой может быть использование WinAPI SetEnvironmentVariable. Но это тот случай, когда да, попытка экономить на спичках.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Чтение параметров ОС
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Функция копеечная по времени выполнения. Взял бы, да проверил )
Ratings: 0 negative/0 positive
Re: Чтение параметров ОС
_vit

Сообщений: 5173
Дата регистрации: 29.07.2002
Померяй насколько быстрая у тебя.
У меня 10-13 мкс

Clear
Declare Integer QueryPerformanceFrequency In kernel32 String @lpFrequency
Declare Integer QueryPerformanceCounter In kernel32 String @lpPerformanceCount
Local lcUserName
Local lcT0Buffer, lcT1Buffer, lnTicksPerSecond, lnTickCount0, lnElapsedTickCount
lcT0Buffer = Space(8)
lcT1Buffer = lcT0Buffer
= QueryPerformanceFrequency(@lcT0Buffer)
lnTicksPerSecond = buf2num(Substr(lcT0Buffer, 1,4)) + buf2num(Substr(lcT0Buffer, 5,4)) * 2^32
= QueryPerformanceCounter(@lcT0Buffer) && Start time measuring
lcUserName = Getenv("UserName")
= QueryPerformanceCounter(@lcT1Buffer) && Stop time measuring
lnTickCount0 = buf2num(Substr(lcT0Buffer, 1,4)) + buf2num(Substr(lcT0Buffer, 5,4)) * 2^32
lnElapsedTickCount = (buf2num(Substr(lcT1Buffer, 1,4)) + buf2num(Substr(lcT1Buffer, 5,4)) * 2^32) - lnTickCount0
? "Execution time:", lnElapsedTickCount / lnTicksPerSecond * 1000000, "uS"
************************
Function buf2num(tcBuffer)
************************
Return Asc(Substr(tcBuffer, 1,1)) + ;
ASC(Substr(tcBuffer, 2,1)) * 2^8 + ;
ASC(Substr(tcBuffer, 3,1)) * 2^16 + ;
ASC(Substr(tcBuffer, 4,1)) * 2^24
Ratings: 0 negative/0 positive
Re: Чтение параметров ОС
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Вит, сравни с апи-функцией. У тебя все под рукой.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Чтение параметров ОС
_vit

Сообщений: 5173
Дата регистрации: 29.07.2002
Поскольку вызов QueryPerformanceCounter тоже чего то стоит вычел это время из результатов.
Надо сказать результаты меня удивили.

[attachment 36501 Untitled.jpg]

Повторный вызов GetEnvironmentVariable всегда занимает меньше времени что понятно а вот Getenv наоборот.
Посмотрите может я где накосячил и не вижу.

Clear
Declare Integer QueryPerformanceFrequency In kernel32 String @lpFrequency
Declare Integer QueryPerformanceCounter In kernel32 String @lpPerformanceCount
Declare Integer GetEnvironmentVariable In kernel32 String lpName, String @lpBuffer, Integer nSize
Local lcUserName, lcBuffer, lnResult
Local lcT0Buffer, lcT1Buffer, lnTicksPerSecond, lnTickCount0, lnElapsedTickCount, lnTQueryPerformance
lcT0Buffer = Space(8)
lcT1Buffer = lcT0Buffer
lcBuffer = Space(100)
= QueryPerformanceFrequency(@lcT0Buffer)
lnTicksPerSecond = buf2num(Substr(lcT0Buffer, 1,4)) + buf2num(Substr(lcT0Buffer, 5,4)) * 2^32
= QueryPerformanceCounter(@lcT0Buffer) && Start time measuring
= QueryPerformanceCounter(@lcT1Buffer) && Stop time measuring
lnTickCount0 = buf2num(Substr(lcT0Buffer, 1,4)) + buf2num(Substr(lcT0Buffer, 5,4)) * 2^32
lnElapsedTickCount = (buf2num(Substr(lcT1Buffer, 1,4)) + buf2num(Substr(lcT1Buffer, 5,4)) * 2^32) - lnTickCount0
lnTQueryPerformance = lnElapsedTickCount / lnTicksPerSecond * 1000000
******First call of Getenv()***********
= QueryPerformanceCounter(@lcT0Buffer) && Start time measuring
lcUserName = Getenv("UserName")
= QueryPerformanceCounter(@lcT1Buffer) && Stop time measuring
lnTickCount0 = buf2num(Substr(lcT0Buffer, 1,4)) + buf2num(Substr(lcT0Buffer, 5,4)) * 2^32
lnElapsedTickCount = (buf2num(Substr(lcT1Buffer, 1,4)) + buf2num(Substr(lcT1Buffer, 5,4)) * 2^32) - lnTickCount0
? "First call of Getenv() duration:", lnElapsedTickCount / lnTicksPerSecond * 1000000 - lnTQueryPerformance, "uS"
******Second call of Getenv()**********
= QueryPerformanceCounter(@lcT0Buffer) && Start time measuring
lcUserName = Getenv("UserName")
= QueryPerformanceCounter(@lcT1Buffer) && Stop time measuring
lnTickCount0 = buf2num(Substr(lcT0Buffer, 1,4)) + buf2num(Substr(lcT0Buffer, 5,4)) * 2^32
lnElapsedTickCount = (buf2num(Substr(lcT1Buffer, 1,4)) + buf2num(Substr(lcT1Buffer, 5,4)) * 2^32) - lnTickCount0
? "Second call of Getenv():", lnElapsedTickCount / lnTicksPerSecond * 1000000 - lnTQueryPerformance, "uS"
******First call of GetEnvironmentVariable()**********
= QueryPerformanceCounter(@lcT0Buffer) && Start time measuring
= GetEnvironmentVariable("UserName", @lcBuffer, Len(lcBuffer))
= QueryPerformanceCounter(@lcT1Buffer) && Stop time measuring
lnTickCount0 = buf2num(Substr(lcT0Buffer, 1,4)) + buf2num(Substr(lcT0Buffer, 5,4)) * 2^32
lnElapsedTickCount = (buf2num(Substr(lcT1Buffer, 1,4)) + buf2num(Substr(lcT1Buffer, 5,4)) * 2^32) - lnTickCount0
? "First call of GetEnvironmentVariable():", lnElapsedTickCount / lnTicksPerSecond * 1000000 - lnTQueryPerformance, "uS"
******Second call of GetEnvironmentVariable()***********
= QueryPerformanceCounter(@lcT0Buffer) && Start time measuring
= GetEnvironmentVariable("UserName", @lcBuffer, Len(lcBuffer))
= QueryPerformanceCounter(@lcT1Buffer) && Stop time measuring
lnTickCount0 = buf2num(Substr(lcT0Buffer, 1,4)) + buf2num(Substr(lcT0Buffer, 5,4)) * 2^32
lnElapsedTickCount = (buf2num(Substr(lcT1Buffer, 1,4)) + buf2num(Substr(lcT1Buffer, 5,4)) * 2^32) - lnTickCount0
? "Second call of GetEnvironmentVariable():", lnElapsedTickCount / lnTicksPerSecond * 1000000 - lnTQueryPerformance, "uS"
************************
Function buf2num(tcBuffer)
************************
Return Asc(Substr(tcBuffer, 1,1)) + ;
ASC(Substr(tcBuffer, 2,1)) * 2^8 + ;
ASC(Substr(tcBuffer, 3,1)) * 2^16 + ;
ASC(Substr(tcBuffer, 4,1)) * 2^24
Declare Integer GetEnvironmentVariable In kernel32 String lpName, String @lpBuffer, Integer nSize
Local lcBuffer, lnResult
lcBuffer = Space(1024)
lnResult = GetEnvironmentVariable (lcVarToGet, @lcBuffer, Len(lcBuffer))
Ratings: 0 negative/0 positive
Re: Чтение параметров ОС
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Я только в понедельник. Как правило, кто-то раньше протестит.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Чтение параметров ОС
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Я только сейчас допер... У меня тоже по всему проекту GETENV('TEMP') используется. А его можно один раз получить, при старте. От болван...


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Чтение параметров ОС
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Рисуй свой "фреймерк", как все солидные фирмы, и прикладники типа нас! )
Ratings: 0 negative/0 positive
Re: Чтение параметров ОС
ABB
Автор

Сообщений: 149
Откуда: Санкт-Петербург
Дата регистрации: 21.10.2006
ChatGPT сообщил
В коде есть переменная "lcVarToGet", которая не была объявлена и инициализирована. Ее значение используется в вызове функции GetEnvironmentVariable.
Ratings: 0 negative/0 positive
Re: Чтение параметров ОС
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
ABB
В коде есть переменная "lcVarToGet", которая не была объявлена и инициализирована. Ее значение используется в вызове функции GetEnvironmentVariable.
Было бы более ценно, если бы он сообщил, что строки с 83-87 вообще не нужны, так как выполняться никогда не будут.
Тогда бы и вопроса "Где переменная?" не возникло бы.
Ratings: 0 negative/0 positive
Re: Чтение параметров ОС
ABB
Автор

Сообщений: 149
Откуда: Санкт-Петербург
Дата регистрации: 21.10.2006
Ну, он еще учиться
Но никто выше не обратил на эти строки внимания
И интересно, что никто не комментирует его решение для серийного номера USB.
Ratings: 0 negative/0 positive
Re: Чтение параметров ОС
Каратаев

Сообщений: 3974
Откуда: Алматы
Дата регистрации: 04.12.2001
У меня в классе goApp вот так прописано
LOCAL lcTmpDir, lcTmpDirPlus
lcTmpDirPlus = "tmp"+SYS(2015)
lcTmpDir = ADDBS(GETENV("TEMP")) + "Prod"
* удаление папки (при закрытии программы иногда не удаляются)
IF DIRECTORY(lcTmpDir)
* очистка папки временных файлов
_oFSO=CreateObject("Scripting.FileSystemObject")
llForce = .T.
TRY
If _oFSO.FolderExists(lcTmpDir)
loFolder=_oFSO.GetFolder(lcTmpDir)
loFolder.Delete(llForce)
Endif
CATCH
* если открыты какие-то файлы, то ничего не поделаем, удаление отложим до другого раза
ENDTRY
ENDIF
RELEASE _oFSO
IF !DIRECTORY(lcTmpDir)
MKDIR (lcTmpDir)
ENDIF
lcTmpDir = ADDBS(lcTmpDir) + lcTmpDirPlus
****************************************************
IF !DIRECTORY(lcTmpDir)
MKDIR (lcTmpDir)
ENDIF
This.PathWork = ADDBS(lcTmpDir)
При старте приложения единожды считывается и записывается в свойство класса приложения.
В папке TEMP создаётся папка приложения (в данном случае у меня это папка Prod), в которой создаётся ещё одна для конкретной сессии приложения (для работы второго экземпляра приложения).
Этот код написан очень давно и менять его не буду - ну совсем не до того сейчас, поэтому прошу не критиковать. Если кому-то пригодится, то уже сами оптимизируйте как хочется...


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 35 kornienko_ru AndyNigmatec Guest (Гостей: 32)

© 2000-2024 Fox Club 
Яндекс.Метрика