Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2004.02.10;
Скачать: [xml.tar.bz2];

Вниз

Прога использует неэкономно процессор   Найти похожие ветки 

 
Olfi   (2003-09-15 21:55) [0]

Получается так, что процессор используется прогой на 98%.
Функция проги заключается в том, чтобы постоянно проверять, нажата ли клавиша на клаве... То есть цикл в неё всё время проверяет. Что делать? Изменить алгоритм или... Я сомневаюсь, что для такой простой задачи нужно полностью забивать процессор частотой 1,7 Гц


 
y-soft   (2003-09-15 22:16) [1]

Правильно сомневаетесь - существует многопоточность и режим ожидания, а Вы, похоже, производите проверку в бесконечном цикле...


 
Jeer   (2003-09-16 10:18) [2]

В цикл вставить:
Applicaton.ProcessMessages;

Или проверять клаву по таймеру.


 
AGGRESSOR   (2003-09-16 10:48) [3]

Applicaton.ProcessMessages тут не поможет, если цикл бесконечный. Т.е. работать другие приложения смогут, но процессор все равно будет забит почти на 100%.
Самое простое- это таймер (1/4 секунды должно быть неплохо).


 
HolACost!   (2003-09-16 10:56) [4]

Ну а какбы хук поставить на клаву вы не хотите, может решение координальнее получиться и осмысленнее?!


 
AGGRESSOR   (2003-09-16 10:59) [5]

>HolACost! © (16.09.03 10:56) [4]
"координальнее"??? Это как, интересно? :)
Хук- это не самое простое решение. Хотя гораздо эффективнее.


 
HolACost!   (2003-09-16 11:03) [6]

координальнее - вся математика этой части программы сменится, чем если менять просто существующий код!!!
На счёт не самого простого решения - это извините правильное решение, а вот о его сложности судить не мне - для меня это просто, но это кому как!


 
AGGRESSOR   (2003-09-16 11:16) [7]

А по-моему правильным решением будет виртуальная клавишва, а не хук. Но для этого надо кардинально (а не как-нибудь иначе, вроде чего-то связанного с координатами) переделывать логику программы, а для таймера нужно лишь одну строчку. Решайте.


 
HolACost!   (2003-09-16 11:20) [8]

ГЫ! В вопросе не указана сфера применения ловушки - может он ловит не только в соей проге - помоему это как-раз так и есть! Извините, но....
Хотя согласен - решайте!


 
AGGRESSOR   (2003-09-16 11:23) [9]

> может он ловит не только в соей проге
Виртуальная клавиша может быть глобальной. Хотя чего мы тут разошлись? Он уже наверняка давно все сделал :))


 
HolACost!   (2003-09-16 11:31) [10]

Я знаю, но ето что-то всётаки не то! Гы!
Забиваем! Пис!


 
Лёша   (2003-09-16 11:34) [11]

если используется вечный цикл, впихни в него :
Sleep(i);
где i = 1... сколько не жалко.

должно помочь.


 
y-soft   (2003-09-16 13:22) [12]

Лёша © (16.09.03 11:34) [11]

Если это первичный поток, то вместо загрузки процессора получится подвисание приложения..


 
Е-Моё имя   (2003-09-16 13:25) [13]

дык спать надо 1-2, и хватит
или ваще 0


 
Olfi   (2003-09-17 16:10) [14]

Ну да, проверка в бесконечном цикле.


while (IsRun) do
begin
for i := 3 to 255 do
begin
//Проверка нажатия клавиши и т. д.
end;
Application.ProcessMessages;
end;

Я пробовал отключить всю проверку, оставляя только цикл и... почти ничего не изменилось. Что делать?


 
Olfi   (2003-09-17 16:14) [15]

Ну да, проверка в бесконечном цикле.


while (IsRun) do
begin
for i := 3 to 255 do
begin
//Проверка нажатия клавиши и т. д.
end;
Application.ProcessMessages;
end;

Я пробовал отключить всю проверку, оставляя только цикл и... почти ничего не изменилось. Что делать?


 
pasha_676   (2003-09-17 16:16) [16]

Мда. Сильно. Повесить прогу для опроса клавы... Так уже давно даже в микропроцессорах не програмят. Так что там у нас насчет хуков и/или таймеров? Не посмотрел еще материал по ним? Будем тупить или изучать?


 
Olfi   (2003-09-17 17:00) [17]

Самый подходящий вариант из тех, что предложили, на мой взгляд - Sleep ().
ТАймер........ нет. Это неудобно. Этот прога должна иметь отдельный модуль, который будет следить за клавой. Модуль Forms в нём юзаться не должен.

Hook... Вы имеет ввиду перехватить нажатие7 Отлично работает! Если не учитывать то, что прога, в которой юзается клава не получает сообщений о нажатии :)))))

А какие есть способы?
Такой опрос клавы за один момент опрашивает клавы около 20 раз! По-моему действительно проще сделать чо-то вроде Sleep (10).

Опрашивать клааву нужно, как вы поняли не своей проги, а всех.


 
pasha_676   (2003-09-17 17:15) [18]


> ТАймер........ нет. Это неудобно. Этот прога должна иметь
> отдельный модуль, который будет следить за клавой. Модуль
> Forms в нём юзаться не должен.

Батенька таймер можно создать и без формы... Таймер и форма вещи вообще разные...


> А какие есть способы?

Опрос в отдельном потоке. В соседнем форуме о нем сейчас писали...


 
Verg   (2003-09-17 17:53) [19]


> Если не учитывать то, что прога, в которой юзается клава
> не получает сообщений о нажатии


Разъясни.

Это читал?

http://www.delphimaster.ru/articles/hooks/index.html


 
Verg   (2003-09-17 17:59) [20]


> pasha_676 © (17.09.03 17:15) [18]


Опрос в бесконечном цикле нагрузит проц в любом потоке.


 
panov   (2003-09-17 22:44) [21]

>Verg © (17.09.03 17:59) [20]

> pasha_676 © (17.09.03 17:15) [18]

Опрос в бесконечном цикле нагрузит проц в любом потоке.


За исключением потока с циклом со Sleep(1), например...


 
Denius   (2003-10-14 16:31) [22]

ДА чего тут спорить... По моему под такие задачи шикарно подходит Thread. Отдельный поток, вставляем Sleep и усе шикарно и красиво...


 
Alec   (2003-11-23 07:08) [23]

ага а вопрос то помойму был как отлавить клавишу (ОДНУ - я так понял) ну и пусть использует "горячие" клавишы!



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2004.02.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.009 c
3-29194
alexproger
2004-01-20 15:47
2004.02.10
Программное создание ODBC DSN


1-29355
zamkom
2004-01-29 12:12
2004.02.10
StrToWord


1-29333
Werewolf
2004-01-29 17:52
2004.02.10
Прозрачный TreeView


1-29467
tovSuhov
2004-01-30 14:07
2004.02.10
Проблема с перезагрузкой


3-29221
MicroWorld
2004-01-19 23:11
2004.02.10
IB and fox





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