Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизApplication.ProcessMessages и загрузка процессора Найти похожие ветки
← →
Pcrepair © (2012-05-27 11:27) [0]Добрый день
Замечено, что в момент загрузки страницы ПРОЦ грузит до 50% видимо в первом Application.ProcessMessages
try
Wbbr.Navigate(UrlSearch, Flags, TargetFrameName, PostData, Headers);
repeat
Application.ProcessMessages; (*видимо тут грузит проц до 50%*)
until Wbbr.ReadyState >= READYSTATE_COMPLETE;
if Wbbr.Document <> nil then
HtmlCodeData := AnsiLowerCase(
(Wbbr.Document as iHTMLDocument2).body.innerhtml);
Application.ProcessMessages; (*тут вроде бы и не надо?*)
except
CodeSite.EnterMethod( Self, "Timer" );
CodeSite.SendError("TWebBrowser failed"); (*бравузер здох*)
CodeSite.ExitMethod( Self, "Timer" );
end;
Вопрос: чем можно заменить Application.ProcessMessages в коде, так чтобы гарантировать загрузку страницы перед выполнением последующих инструкций
← →
Cobalt © (2012-05-27 11:56) [1]Отчего же ты грешишь на Application.ProcessMessages, который в основном цикле программы - Application.Run - как-то не жрет процессорное время?
Лучше, открой эту страничку в IE и полюбуйся на его загрузку процессора.
← →
Pcrepair © (2012-05-27 12:13) [2]любовались - не более 3% при загрузке страницы
впрочем уже насоветовали
repeat
Sleep (1);
Application.ProcessMessages;
надо было просто приложить АПМ к чему то
теперь не более 7% загрузки проца
← →
Anatoly Podgoretsky © (2012-05-27 12:27) [3]А ты что решил процессор разогреть.
← →
Rouse_ © (2012-05-27 13:28) [4]Вместо:
Sleep (1); + Application.ProcessMessages;
Сделай Application.HandleMessage()
← →
Sha © (2012-05-27 14:58) [5]> Pcrepair © (27.05.12 11:27)
просто запомни: тебе запрещено использовать Application.ProcessMessages
← →
Pcrepair © (2012-05-27 18:20) [6]
Вместо:
Sleep (1); + Application.ProcessMessages;
Сделай Application.HandleMessage()
что то в интернетуме ничего вразумительного не нашел
в случае со Sleep идет повтор ожидания с заданным интервалом, пока не выполнится условие READYSTATE_COMPLETE
а что происходит при использовании Application.HandleMessage(), и для чего()? или там нужен параметр? делфи допускает не показывать() если нет параметра
← →
Sha © (2012-05-27 18:53) [7]Pcrepair © (27.05.12 18:20) [6]
События используемого компонента не для тебя, да?
← →
Pcrepair © (2012-05-28 15:39) [8]нет не для меня.
OnDownloadComplete и прочие не походят, так как нет гарантии что они возникают после закачки и обработки страницы
код в топике гарантирует, в том числе и в ситуации с низкой скоростью закачки, правильную обработку кода(ДОМ). это проверено
← →
Sha © (2012-05-28 17:38) [9]> Pcrepair © (28.05.12 15:39) [8]
> OnDownloadComplete и прочие не походят,
а доказать можешь?
> код в топике гарантирует, в том числе и в ситуации с низкой скоростью закачки,
> правильную обработку кода(ДОМ). это проверено
код в топике - костыль, и это слишком мягко сказано
← →
sniknik © (2012-05-28 18:09) [10]> код в топике гарантирует
единственное что он делает, так - из событийной модели, и асинхронной загрузки, делает псевдо линейную модель, и псевдо синхронную загрузку. т.е. типа и код линейный, и не виснет ничего... в простонародье называется "и рыбку съесть и... не помню ;) чего там дальше". хорошим обычно не кончается.
единственный плюс - не нужно разбираться/учить как оно на самом деле работает... хотя, если подумать, это тоже минус.
> это проверено
центром сертификации памперсов? созданным специально для проверки данного...
← →
Pcrepair © (2012-05-28 18:09) [11]а сам то пробовал OnDownloadComplete?
и как результат?
а код в топике, во всяком случает работает стабильно и как нужно
← →
Sha © (2012-05-28 18:22) [12]> Pcrepair © (28.05.12 18:09) [11]
Пробовал.
Ради интереса на обычном TWebBrowser написал бота для БК, если тебе это о чем-то говорит.
Без единого Application.ProcessMessages.
← →
Pcrepair © (2012-05-28 18:45) [13]что, с использованием события OnDownloadComplete?
а для чего в этом боте использовался Твеббраузер? и какого размера страницу оно загружало? хотя бы 1 мб?
← →
Sha © (2012-05-28 18:50) [14]> Pcrepair © (28.05.12 18:45) [13]
> что, с использованием события OnDownloadComplete?
и других
> а для чего в этом боте использовался Твеббраузер?
для всего; в частности, была довольно интересная задача - пробежать по всем комнатам башни (комната - страница)
> и какого размера страницу оно загружало? хотя бы 1 мб?
да пофиг абсолютно
← →
Сергей М. © (2012-05-28 23:01) [15]
> Pcrepair
Что ж ты рогом-то уперся в OnDownloadComplete, будто это единственное событие у компонента ?
Вот же в справке черным по белому написано:
property OnDocumentComplete: TWebBrowserDocumentComplete;
Occurs when the document being navigated to reaches ReadyState_Complete.
Description
Write an OnDocumentComplete event handler to take specific action when a frame or document is fully loaded into the Web browser .For a document without frames, this event occurs once when the document finishes loading. On a document containing multiple frames, this event occurs once for each frame. When the multiple-frame document finishes loading, the Web browser fires the event one final time.
Как раз то самое что ты делаешь ручками с тупым циклом со слипом внутри)
← →
sniknik © (2012-05-28 23:47) [16]> Как раз то самое что ты делаешь ручками с тупым циклом со слипом внутри)
вообще то не то же самое. он подменяет событийность, с оповещением на линейность с мониторингом...
ну по аналогии (грубой) вместо того чтобы заниматься своими делами и подойти к телефону когда зазвонит (событие), он поминутно снимает трубку с вопросом "барышня, меня никто не спрашивал?". а между этим пытается успеть со своими делами (ProcessMessages).
← →
Германн © (2012-05-29 01:36) [17]
> он подменяет событийность, с оповещением на линейность с
> мониторингом...
Просто никто на всех тех форумах, где он задал вопрос, не дал ему никакого готового кода, кроме Sleep (1);
<offtop>
P.S.
Мне вот интересно. Pcrepair и leklerk это разные люди в реале? Или это один и тот же персонаж? И тот и другой забрасывают свои вопросы одновременно на кучу форумов по Дельфи в надежде, что хоть где-нибудь дадут код. Спрашивают правда про разное, но как-то удивительно синхронно.
P.P.S.
А уж сегодня ещё одно странное совпадение.
После ответа
> sniknik © (28.05.12 18:09) [10]
на вопрос Pcrepair в данной ветке, leklerk менее чем через 50 минут задал вопрос "Когда нужно использовать ООП?" http://delphimaster.net/view/2-1338216754/
То что смысл высказывания sniknik не имеет никакого отношения к ООП - значения не имеет, ибо и Pcrepair и leklerk в данной теме совершенно не разбираются!
</offtop>
← →
Германн © (2012-05-29 01:45) [18]
> То что смысл высказывания sniknik не имеет никакого отношения
> к ООП
Тут я несколько погорячился, конечно. :)
← →
Sha © (2012-05-29 12:11) [19]> Pcrepair
может, после этого примера ты разлюбишь Application.ProcessMessages//демонстрация возможной ошибки при использовании Application.ProcessMessages
var
Count: integer;
procedure TForm1.Timer1Timer(Sender: TObject);
var
i: integer;
begin;
//имитация вычислений
Count:=0;
for i:=1 to 3 do begin;
Sleep(Random(800));
inc(Count);
Application.ProcessMessages;
end;
//показываем результат
Memo1.Lines.Add(IntToStr(Count));
end;
← →
Германн © (2012-05-30 01:07) [20]
> Sha © (29.05.12 12:11) [19]
>
> > Pcrepair
>
> может, после этого примера ты разлюбишь Application.ProcessMessages
Фетишист?
Разве обязательно любить (или не любить) инструмент? Инструменты надо правильно использовать, зная их возможности и особенности. Только и всего. :)
← →
Sha © (2012-05-30 01:53) [21]Интересная мысль.
Теперь все знают, что надо делать с инструментами.
← →
Германн © (2012-05-30 02:15) [22]Давай жить дружно! (с) Кот Леопольд.
Не отвечай на мои высказывания после полуночи . Лучше ответь на следующее утро.
← →
Сергей М. © (2012-05-30 22:37) [23]
> sniknik © (28.05.12 23:47) [16]
Да пОхрену)
Для автора, полагаю, важнее будет понимание того что все велосипеды уже изобретены и выглядят они вполне изящно - достаточно не полениться жмакнуть F1
← →
Max (2012-05-30 23:58) [24]
> может, после этого примера ты разлюбишь Application.ProcessMessages
так а зачем ProcessMessages из таймера вызывать? в крайнем случае можно флажок завести
← →
Sha © (2012-05-31 00:12) [25]> Max (30.05.12 23:58) [24]
> так а зачем ProcessMessages из таймера вызывать?
Ну, если тебе не лень нажимай кнопку, а я ленивый.
> в крайнем случае можно флажок завести
Какой флажок, ты понял о чем пример?
← →
Max (2012-05-31 00:47) [26]
> Какой флажок
такой
var
Count: integer;
BusyFlag: boolean = False;
procedure Tblazar.Timer1Timer(Sender: TObject);
var
i: integer;
begin;
if BusyFlag then exit;
BusyFlag := True;
try
//ваша имитация
Count:=0;
for i:=1 to 3 do
begin
Sleep(Random(500));
inc(Count);
Application.ProcessMessages;
end;
Memo1.Lines.Add(IntToStr(Count));
finally
BusyFlag := False;
end;
end;
> ты понял о чем пример
что там может быть не понятного?
← →
Sha © (2012-05-31 01:21) [27]> Max (31.05.12 00:47) [26]
при этом ты избавился от вложенных вызовов ProcessMessages в данном месте, но
1. как-то надо будет защитить все другие места вызова ProcessMessages, если они есть
2. часть сообщений ты потеряешь, а они могут быть нужны
3. не факт, что процедура, вызванная из ProcessMessages, не навредит текущей, т.к. у них есть общие глобальные переменные
4. ты теряешь контроль над ходом и временем выполнения
← →
Max (2012-05-31 01:40) [28]
> как-то надо будет защитить все другие места вызова ProcessMessages,
> если они есть
ну само собой
> часть сообщений ты потеряешь, а они могут быть нужны
ты имеешь ввиду часть вызовов таймера? ну так можно завести другой таймер, где нет тяжелой обработки или может вообще нить отдельную (я ж не знаю о какой задаче говорим)
3,4 не совсем понял, подозреваю, что чего-то не понимаю :)
← →
Anatoly Podgoretsky © (2012-05-31 06:28) [29]> Max (31.05.2012 00:47:26) [26]
Хреновый пример, такие вещи делают не флагом, а с помощью Enabled и без
какой либо проверки.
Timer1.Enabled := False;
try
А пример у Sha нормальный, демонстрирует то что нужно
← →
sniknik © (2012-05-31 08:02) [30]>> как-то надо будет защитить все другие места вызова ProcessMessages, если они есть
> ну само собой
перевод:
> для нормальной работы кода с ProcessMessages, нужно сделать так чтобы он не вызывался ни в одной из возможный ситуаций.
> ну само собой
???
и это обсуждение к примеру показывающему, что ProcessMessages использовать не нужно... нда.
← →
Sha © (2012-05-31 09:09) [31]Это обсуждение, показывающее, что одна глупость тянет за собой кучу других.
← →
Sha © (2012-05-31 09:23) [32]> sniknik © (31.05.12 08:02) [30]
и, да, переводчики часто теряют контекст
← →
Sha © (2012-05-31 09:48) [33]> Max (31.05.12 01:40) [28]
> ты имеешь ввиду часть вызовов таймера?
> ну так можно завести другой таймер
Таймер тут вообще ни при чем, это просто пример обработчика сообщения.
Речь идет вообще об опасности вызова ProcessMessages из процедуры обработки сообщения, т.е. об опасности вложенных вызовов ProcessMessages.
> 3,4 не совсем понял, подозреваю, что чего-то не понимаю :)
Имеется в виду, что у тебя внутри обработки одного сообщения начинается обработка других. Это может быть опасно, т.к., во-первых, главная форма, все что на ней и, может быть, не на ней, - общие переменные, которые никак не защищены и могут быть использованы непредсказуемо. Во-вторых, отрисовка чего-то одного внутри другого также опасна. В-третьих, могут быть логически нестыковки, например, когда внутри обработки результатов запроса ты позволяешь пользователю послать еще десяток. В-четвертых, могут быть проблемы с другими компонентами, когда кто-то другой может не рассчитывать, что его код будут вызывать подобным образом, или наоборот, может думать, что один во вселенной, кому позволено так вызывать.
Возможно, всех этих проблем у тебя пока нет. Пока нет.
← →
Loginov Dmitry © (2012-05-31 23:21) [34]
> такие вещи делают не флагом, а с помощью Enabled и без
> какой либо проверки.
Отключение Enabled, не спасает, если в очереди уже есть таймерные сообщения. Не помню где, но на этом приходилось спотыкаться.
Надежнее обработчик отключить:Timer1.OnTimer := nil;
try
...
finally
Timer1.OnTimer := .....;
end;
← →
Anatoly Podgoretsky © (2012-06-01 06:47) [35]> Loginov Dmitry (31.05.2012 23:21:34) [34]
Enabled как раз и отключает, сообщение остается в очереди
← →
Плохиш © (2012-06-01 15:20) [36]
> Отключение Enabled, не спасает, если в очереди уже есть
> таймерные сообщения.
Сообщения от таймера не дублируются, по-стандарту используемой ОС.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.067 c