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

Вниз

Что означает возвращаемое значение функции GetCursorPos?   Найти похожие ветки 

 
Очень Злой   (2012-11-05 22:52) [0]

может ли оно быть false и в результате каких причин?


 
Очень Злой   (2012-11-05 22:55) [1]

на всякий случай подробнее опишу проблему... Может моя проблема и не связана с GetCursorPos.

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

Код такой:
procedure TFrmmain.RecalcText;
var
 curpos: TPoint;
 acc: IAccessible;
 vChild: Variant;
 bsName, bsValue: WideString;
begin
 if GetCursorPos(curpos) and ((curpos.x <> g_pt.x) or (curpos.y <> g_pt.y)) then
 begin
   g_pt := curpos;
   if (SUCCEEDED(AccessibleObjectFromPoint(curpos, acc, vChild))) then
   try
     bsName := "";
     bsValue := "";
     acc.get_accName(vChild, bsName);
     acc.get_accValue(vChild, bsValue);
     ObjName:=bsName;
     ObjValue:=bsValue;
   finally
     VarClear(vChild);
     acc := nil;
   end;
 end;
end;

// таймер генерирует это событие раз в секунду
procedure TFrmMain.Timer1Timer(Sender: TObject);
begin
 CoolTrayIcon1.HideTaskbarIcon;
 RecalcText;
 if ObjName<>ObjLastName then
   begin
      if assigned(FlWin) then FreeandNil(FlWin);
      CoolTrayIcon1.IconIndex:=0;
      ObjLastName:=ObjName;
      if (ObjValue="") and (length(ObjName)<>0) and (length(ObjName)<700) then
      begin
        Timer1.Enabled:=false;
        SearchFromDatabase(ObjName); // тут происходит поиск по БД и создание окна, с отображением результатов поиска, с сохранением указателя на него в FlWin
        Timer1.Enabled:=true;
      end;
   end;
end;


Смысл сего: заходим браузером на некий сайт, содержащий вопросы и варианты ответов, наводим мышку на каждый вопрос и появляется окошко типа хинт с подсказкой правильного ответа.
сама БД находится на другой машине, так что загрузка процессора моей машины не должна тормозить саму БД.
остальной код не содержит ничего тяжелого. Если браузер не грузит процессор, то все работает отлично.
повышение приоритета моего процесса и понижение приоритета процесса браузера не дает никаких результатов.
Проблема еще в том, что на тот сайт можно зайти только в определенное время (он в корпоративной сети) и найти причину таких глюков посему сейчас невозможно... разве что поискать еще что-то содержащее строки текста и тормозящее процессор..., а открытие сохраненных на локальном диске страничек с того сайта уже не дает того эффекта. Т.е. при отладке используя открытие сохраненных страничек все отлично работает, а при работе наприямую с тем сайтом - начинаются проблемы, визуально проявляющиеся в том, что водишь мышкой в нужных местах, а подсказки или не появляются, или появляются с большим запозданием.

Что может быть причиной этого?
Попробую найти что-нить для воссоздания ситуации с нагрузкой процессора браузером, тогда хоть смогу вести лог и выяснить причину...
Но пока нет такой возможности - у меня только 2 варианта:
1. Пока браузер тормозит начинаются проблемы с интерфейсом Iaccessible
2. Возможно функция GetCursorPos возвращает false.  Может ли она вернуть false и в результате каких причин?


 
DVM ©   (2012-11-05 22:56) [2]

Посмотри в исходниках Windows или ReactOs, там некоторые функции возвращают всегда true, а в документации шаблонная фраза приводится.


 
DVM ©   (2012-11-05 22:57) [3]


> Возможно функция GetCursorPos возвращает false

отладчик возьми да погляди или в лог выводи


 
Омлет ©   (2012-11-05 23:14) [4]

> или ReactOs

Уж лучше в Wine.


 
AV ©   (2012-11-06 09:14) [5]

if not(GetCursorPos(curpos)) then
begin
  E := GetLastError;
  ToLog(E);
end;

if (curpos.x <> g_pt.x) or (curpos.y <> g_pt.y) then
begin


 
RWolf ©   (2012-11-06 10:13) [6]

[i]> при отладке используя открытие сохраненных страничек все отлично работает, а при работе наприямую с тем сайтом - начинаются проблемы[/i]

ну и при чём тут GetCursorPos?


 
Очень Злой   (2012-11-06 14:20) [7]


> ну и при чём тут GetCursorPos?


не знаю, поэтому и спрашиваю... Вроде и код небольшой, а что-то  ведь глючит...
Ну правда есть еще одно предположение что при 100% загрузке процессора  тормозит провайдер: Oracle Provider for OleDB.

пока не могу воссоздать ситуацию чтобы повыводить все в лог и проанализировать, поэтому и спрашиваю чтобы заранее знать где копать не нужно...

Например может ли GetCursorPos возвращать false при сильной загрузке процессора? или єта функция всегда должна возвращать true?


 
DVM ©   (2012-11-06 14:42) [8]


> Очень Злой   (06.11.12 14:20) [7]


> Например может ли GetCursorPos возвращать false при сильной
> загрузке процессора? или єта функция всегда должна возвращать
> true?

чего гадать, поставить в код условие и в лог вывести сложно что ли?


 
Очень Злой   (2012-11-06 17:31) [9]


> чего гадать, поставить в код условие и в лог вывести сложно
> что ли?


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


 
Очень Злой   (2012-11-06 18:10) [10]

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


 
DVM ©   (2012-11-06 18:10) [11]


> Очень Злой   (06.11.12 17:31) [9]


> что не имею возможности восоздать ту ситуацию когда начинаются
> проблемы

тут либо ждать, либо попытаться воспользоваться какими либо средствами для стресс-тестирования приложений (если есть подозрения)


 
Очень Злой   (2012-11-06 18:27) [12]

вобщем  похоже что к GetCursorPos претензий нет
и похоже что глюки возникают из-за срабатывания таймера в то время, когда еще не завершена работа ранее вызванного им события OnTimer


 
Очень Злой   (2012-11-06 19:03) [13]

блин. точно проблема с таймером оказалась... вернее при загрузке проца работа с IAccessible начинает тормозить, и поєтому таймер успевал за єто время срабатывать еще несколько раз

перенес отключение и включение таймера соответственно в начало и в конец обработчика

procedure TFrmMain.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled:=false;
...      
// тут остальной код
...  
Timer1.Enabled:=true;
end;


глюки исчезли...
правда тормозит при загрузке проца на 100%, но это уже естественно, но зато глюки пропали...


 
DVM ©   (2012-11-06 19:08) [14]

Сообщения таймера не помещаются в очередь если там есть еще не обработанные. Так что при сильной загрузке системы скорее будут пропущены тики таймера, чем он сработает еще раз когда обработка предыдущего сообщения не завершена. Обработка происходит в любом случае в одном потоке, так что одновременно ничего происходить не будет и накладки невозможны.


 
Очень злой   (2012-11-06 21:27) [15]


> Обработка происходит в любом случае в одном потоке, так
> что одновременно ничего происходить не будет и накладки
> невозможны.


Конечно в одном, никто и не говорит про несколько потоков.


> Сообщения таймера не помещаются в очередь если там есть
> еще не обработанные. Так что при сильной загрузке системы
> скорее будут пропущены тики таймера, чем он сработает еще
> раз когда обработка предыдущего сообщения не завершена.


А вот насчет этого - проверьте сами:

Timer1.interval:=200;

...

procedure TForm1.Timer1Timer(Sender: TObject);
begin
memo1.Lines.Add("начало обработчика");
sleep(500);
Application.ProcessMessages;
sleep(200);
memo1.Lines.Add("конец обработчика");
end;


 
Inovet ©   (2012-11-06 21:41) [16]

> [15] Очень злой   (06.11.12 21:27)
> ProcessMessages

Ключевое слово.


 
DVM ©   (2012-11-06 21:50) [17]

Про WM_TIMER я неверно написал. WM_TIMER не помещается в очередь, если там есть более высокоприоритетные сообщения.



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

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

Наверх





Память: 0.5 MB
Время: 0.003 c
15-1359634342
Дельфист
2013-01-31 16:12
2013.06.09
Источник бесперебойного питания


2-1352118969
AlphaHuman
2012-11-05 16:36
2013.06.09
нужен ли try..exept


8-1232018638
KiLLiR
2009-01-15 14:23
2013.06.09
Что делать, если изображение больше отведенной для него области?


15-1359009539
O'ShinW
2013-01-24 10:38
2013.06.09
Почему в снайперских винтовках обычно маленький магазин?


2-1352141565
Очень Злой
2012-11-05 22:52
2013.06.09
Что означает возвращаемое значение функции GetCursorPos?





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