Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Узнать частоту обновления экрана? Win9X, WinXP 
:(
    Опции темы
Nicholas
  Дата 23.5.2005, 02:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



Весь день просидел пытаясь получить частоту обновления экрана - нашел море примеров, но ни один не работает!!!

Подскажите как получить частоту в герцах (НЕ ИЗ РЕЕСТРА!), даже если в свойствах экрана стоит "Определяется адаптером"?

EnumDisplaySettings(nil,0,DevMode)
DevMode.dmDisplayFrequency - не работает

DC := CreateDC('DISPLAY', nil, nil, nil);
DefFR:=GetDeviceCaps(DC, VREFRESH) - не работает

smile

Это сообщение отредактировал(а) Nicholas - 23.5.2005, 02:58
PM MAIL ICQ   Вверх
Poseidon
Дата 23.5.2005, 03:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 10
Всего: 133



Цитата(Nicholas @ 23.5.2005, 02:57)
DC := CreateDC('DISPLAY', nil, nil, nil);
DefFR:=GetDeviceCaps(DC, VREFRESH) - не работает

А чего не работает? У меня вот этот пример все отлично показывает

Код
if Win32Platform=VER_PLATFORM_WIN32_NT then
 ShowMessage(IntToStr(GetDeviceCaps(Form1.Canvas.Handle,VREFRESH))+' Гц');

Добавлено @ 03:06
Вот еще рабочий пример http://vingrad.ru/DELPHI-DLP-002783


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Nicholas
Дата 24.5.2005, 03:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



Все это не работает в Windows Millenium!?
PM MAIL ICQ   Вверх
Girder
Дата 30.5.2005, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Один... из вариантов. Правда... не самый точный smile

Код
function GetTime_3DA():int64;
begin
// Sleep(50);
 asm
  pushad
  pushfd
  mov dx,3dah
  in al,dx
  test al,8
  jz @wait_on_h
@wait_off_h:
  in al,dx
  test al,8
  jnz @wait_off_h
@wait_on_h:
  in al,dx
  test al,8
  jz @wait_on_h
  cpuid
  rdtsc
  push eax
  push edx
  mov dx,3dah
@wait_off_h2:
  in al,dx
  test al,8
  jnz @wait_off_h2
@wait_on_h2:
  in al,dx
  test al,8
  jz @wait_on_h2
  rdtsc
  pop ecx
  pop ebx
  sub eax,ebx
  sbb edx,ecx
  lea esi,Result
  mov [esi],eax
  mov [esi+4],edx
  popfd
  popad
 end;
end;

function GetTime_101mc():Int64;
begin
 Sleep(50);
 asm
  pushfd
  pushad
  cpuid
  rdtsc
  push eax
  push edx
  push dword ptr 101
  call sleep
  rdtsc
  pop ecx
  pop ebx
  sub eax,ebx
  sbb edx,ecx
  lea esi,Result
  mov [esi],eax
  mov [esi+4],edx
  popad
  popfd
 end;
end;

function GetTime_1mc():Int64;
begin
 Sleep(50);
 asm
  pushfd
  pushad
  cpuid
  rdtsc
  push eax
  push edx
  push dword ptr 1
  call sleep
  rdtsc
  pop ecx
  pop ebx
  sub eax,ebx
  sbb edx,ecx
  lea esi,Result
  mov [esi],eax
  mov [esi+4],edx
  popad
  popfd
 end;
end;

function GetTime_RDTSC():Int64;
begin
 Sleep(50);
 asm
  pushfd
  pushad
  cpuid
  rdtsc
  push eax
  push edx
  rdtsc
  pop ecx
  pop ebx
  sub eax,ebx
  sbb edx,ecx
  lea esi,Result
  mov [esi],eax
  mov [esi+4],edx
  popad
  popfd
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i,n,t:int64;
    j:integer;
begin
 i:=10*(GetTime_101mc-GetTime_1mc)-GetTime_RDTSC;
 j:=9;
 n:=GetTime_3DA;
 repeat
  t:=GetTime_3DA;
  if t<n then n:=t;
  dec(j);
 until (j=0);
 Caption:=FloatToStr(i)+';'+FloatToStr(i/n);
end;


PS: Тестил в Win98

Это сообщение отредактировал(а) Girder - 30.5.2005, 18:37


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
p0s0l
Дата 31.5.2005, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Girder, может можно прочитать из какого-то порта это значение, а не мерять ? smile

Nicholas, а ты DevMode инициализируешь перед вызовом EnumDisplaySettings ?

Если что, можно еще через DirectDraw:
Код
uses DirectDraw;

function GetRefreshRate : cardinal;
var dd : IDirectDraw;
begin
  Result := 0;
  DirectDrawCreate (nil, dd, nil);
  if dd <> nil then dd.GetMonitorFrequency(Result);
  if Result = 6000 then Result := 60;
end;

// пример
procedure Button1Click...
begin
  ShowMessage (IntToStr(GetRefreshRate));


Насчет 6000 - в MSDN'е сказано:
Цитата(MSDN)
Note: 60Hz is returned 6000
Поэтому и сделал такую проверку на всякий случай, хотя у меня при 60Гц возвращается ровно 60 без всяких условностей...


--------------------
С уважением, г-н Посол.
PM   Вверх
Girder
Дата 2.6.2005, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Цитата(p0s0l @ 31.5.2005, 21:52)
Girder, может можно прочитать из какого-то порта это значение, а не мерять ?
Конечно... надо просто узнать частоту синхросигнала smile - а потом пересчитать на горизонталь и вертикаль smile - есть "стандартные" 25Mhz, 28Mhz - а есть "внешний источник" (Просто я не уверен - что будет работать на всех видюхах по ентому и не стал выкладывать smile )

Цитата(p0s0l @ 31.5.2005, 21:52)
Nicholas, а ты DevMode инициализируешь перед вызовом EnumDisplaySettings ?
в Win9X - енто не работает smile

Это сообщение отредактировал(а) Girder - 2.6.2005, 14:55


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Guest
  Дата 8.6.2005, 16:48 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered













Цитата(p0s0l @ 31.5.2005, 20:52)
Если что, можно еще через DirectDraw:


Код

uses DirectDraw;

function GetRefreshRate : cardinal;
var dd : IDirectDraw;
begin
  Result := 0;
  DirectDrawCreate (nil, dd, nil);
  if dd <> nil then dd.GetMonitorFrequency(Result);
  if Result = 6000 then Result := 60;
end;

// пример
procedure Button1Click...
begin
  ShowMessage (IntToStr(GetRefreshRate));


Хотите верьте , хотите нет....

ВОЗВРАЩАЕТ НОЛЬ!!! smile
  Вверх
Nicholas
Дата 8.6.2005, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



Цитата(Girder @ 30.5.2005, 18:34)
Один... из вариантов. Правда... не самый точный 


И вправду не самый точный, но работает, хотя если десять раз подряд запустить - выдает частоту +- 2 единицы.


Добавлено @ 17:02
Цитата(Guest @ 8.6.2005, 16:48)
Хотите верьте , хотите нет....

ВОЗВРАЩАЕТ НОЛЬ!!! 


сори, забыл войти. smile

Это сообщение отредактировал(а) Nicholas - 8.6.2005, 16:59
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1395 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.