Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.30;
Скачать: CL | DM;

Вниз

XML и зависание главной формы   Найти похожие ветки 

 
Student :) ©   (2008-03-03 13:23) [0]

Привет всем знатокам!!
вопрос есть некий XML документ на сервере Я ЕГО загружаю и парсю но при этом процесе
главная форма зависает ! как мне ето обойти ? без потоков делаю так.

procedure TForm1.Button1Click(Sender: TObject);
var
//CityID: string;
CoDoc: CoDOMDocument;
XMLD: DOMDocument;
r: IXMLDOMElement;
FNode: IXMLDOMNode;
i,y: integer;
begin
XMLD:=CoDoc.Create ;
XMLD.async:=false;
URL:=ComboBox1.Text;
XMLD.load(URL);
////////////////////////// здесь чтото не так  
while not XMLD.load(URL) do
Application.ProcessMessages;
////////////////////////////
memo1.Clear;
listbox1.Clear;
r:=XMLD.documentElement;
FNode:= r.SelectSingleNode("//rss");
if FNode.attributes.getNamedItem("version").text<>"2.0"
then
 begin
  Memo1.Lines.Add("error no 2.0");
  Exit;
 end;


 
Palladin ©   (2008-03-03 13:25) [1]


> ////////////////////////// здесь чтото не так  while not
> XMLD.load(URL) do Application.ProcessMessages; ////////////////////////////

ага :) что то не так...


 
Student :) ©   (2008-03-03 13:32) [2]

Уважаемые а как переделать? и прогресс бар бы привязать


 
Student :) ©   (2008-03-03 13:45) [3]

к сожелению не кто не знает :(


 
Reindeer Moss Eater ©   (2008-03-03 13:49) [4]

два раза лоад для надежности?
:)


 
Сергей М. ©   (2008-03-03 13:50) [5]


> Я ЕГО загружаю и парсю


Судя по


> while not XMLD.load


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


 
Student :) ©   (2008-03-03 14:06) [6]

а как правильно?


 
Student :) ©   (2008-03-03 14:14) [7]

может так
XMLD.load(URL);
for I:=0 to 20 do
begin
Application.ProcessMessages;
end;


 
Kolan ©   (2008-03-03 14:17) [8]

Я что то не понимаю&#133

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


 
Student :) ©   (2008-03-03 15:12) [9]

ну как помогите горю!! сесия!


 
Игорь Шевченко ©   (2008-03-03 15:14) [10]


> сесия!


У всех жена ушла (с)


 
Reindeer Moss Eater ©   (2008-03-03 15:19) [11]

ну как помогите горю!! сесия!

неправильно. правильно :
ну ка помогите горю!! сесия!


 
clickmaker ©   (2008-03-03 15:20) [12]


> for I:=0 to 20 do
> begin
> Application.ProcessMessages;
> end;

20 маловато


 
Student :) ©   (2008-03-03 15:21) [13]

а поправде как вставить Application.ProcessMessages;


 
DiamondShark ©   (2008-03-03 15:26) [14]


> Student :) ©   (03.03.08 15:21) [13]
> а поправде как вставить Application.ProcessMessages;

Выделить мышкой, нажать Ctrl C, перейти в текстовый редактор, нажать Ctrl V.

Как тебе что-то объяснить, если ты не только над кодом не думаешь, но и по-русски с трудом лопочешь.

ты над строчкой

> XMLD.async:=false;

помедитировал, или содрал не глядя?


 
Сергей М. ©   (2008-03-03 15:27) [15]

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

А ведь прогресс-бар подразумевает известное число итераций !


 
oxffff ©   (2008-03-03 15:40) [16]


> А ведь прогресс-бар подразумевает известное число итераций
> !


прогресс-бар ничего не подразумевает.

>как мне ето обойти ?

Парсь в отдельном потоке.


 
Сергей М. ©   (2008-03-03 15:45) [17]

Кстати, заглянув в реестр, можно обнаружить, что объект Msxml2.DOMDocument.4.0 поддерживает ThreadingModel = Both.

Это означает, что можно смело и без дополнительных ухищрений вызвать  XMLD.load() в дополнительном потоке, и, пока тот пыхтит с загрузкой и парсингом, в основном потоке занять юзера чем-либо увлекательным: хоть анимашку включить-показать ему хоть липовым прогресс-баром поелозить туда-сюда. А по окончанию загрузки и парсинга в том же основном потоке продолжить работу с XMLD.


 
Сергей М. ©   (2008-03-03 15:47) [18]


> прогресс-бар ничего не подразумевает


да ты что ?!

И ни Min, ни Max, ни Step, ни Position ему не требуется указывать ?)


 
oxffff ©   (2008-03-03 15:54) [19]


> Сергей М. ©   (03.03.08 15:47) [18]
>
> > прогресс-бар ничего не подразумевает
>
>
> да ты что ?!
>
> И ни Min, ни Max, ни Step, ни Position ему не требуется
> указывать ?)


Во первых в прогресс бар в общем случае есть только процентное соотношение заливки. И все.
Все остальное дело библиотек Wrapperoв. (например VCL).

И во вторых пакажите связь между
Min, Max, Step, Position и числом итераций. :)


 
Palladin ©   (2008-03-03 15:56) [20]


> oxffff ©   (03.03.08 15:54) [19]
> И во вторых пакажите связь между Min, Max, Step, Position
> и числом итераций. :)

прямопропорциональная...


 
Сергей М. ©   (2008-03-03 16:03) [21]


> прогресс бар в общем случае есть только процентное соотношение
> заливки


Не возражаю)


> пакажите связь между
> Min, Max, Step, Position и числом итераций


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


 
oxffff ©   (2008-03-03 16:06) [22]


> прямопропорциональная...


Не угадал. :)

Почему вы утверждаете, что число итераций вычисляется заранее?
....

Bar.position:=Trunc(value) ?

......

Что мешает изменять шкалу в ран-time, вы что не видели окно копирования в Windows где время изменяется?


 
oxffff ©   (2008-03-03 16:09) [23]


> Сергей М. ©   (03.03.08 16:03) [21]


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

While value<100 do
  begin
  nextvalue(value);
  Bar.position:=Trunc(value);
  end;


 
Palladin ©   (2008-03-03 16:10) [24]


> oxffff ©   (03.03.08 16:06) [22]

ничего подобного... идеологически это уже не есть поведение progressbar, это есть поведение "я не повисло, я чего то делаю, но когда кончится не знаю"...


 
trubin ©   (2008-03-03 16:15) [25]


> ничего подобного... идеологически это уже не есть поведение
> progressbar, это есть поведение "я не повисло, я чего то
> делаю, но когда кончится не знаю"...


Раз пришлось так делать, начальство хотело видеть непременно прогресс бар. Правда он временами дергался туда сюда :)). Но начальник был доволен улыбаясь говорил "Ведь можешь если премию хочешь" :))

P.S.
 Я уже там не работаю :)))))


 
oxffff ©   (2008-03-03 16:17) [26]


> Встречное предложение - показать, как заранее не зная максимального
> число итераций парсера показать нелиповый прогресс-бар,
> отражающий в том самом процентном соотношении отношение
> максимального числа итераций парсера к номеру текущей итерации)


см. [23].

А теперь подумайте сами как реализовать функцию nextvalue(value), которая будет при получении списка под-нод корректировать следующее значение в зависимости от их числа.

Подсказок от меня не будет.


 
Сергей М. ©   (2008-03-03 16:20) [27]


> oxffff ©   (03.03.08 16:17) [26]
>
>


> см. [23].
>


см. [24]


 
oxffff ©   (2008-03-03 16:26) [28]


> Сергей М. ©   (03.03.08 16:20) [27]


Смотрим ваше начальное высказывание

>А ведь прогресс-бар подразумевает известное число итераций !

У вас видимо так и есть. И это неплохо. Просто можно и по другому.


> Palladin ©   (03.03.08 16:10) [24]
>
> > oxffff ©   (03.03.08 16:06) [22]
>
> ничего подобного... идеологически это уже не есть поведение
> progressbar, это есть поведение "я не повисло, я чего то
> делаю, но когда кончится не знаю"...


К своим словам незабывай добавлять IMHO. :)
Где этот закон (Том, Глава, страница) в студию? :))


 
oxffff ©   (2008-03-03 16:29) [29]


> Palladin ©   (03.03.08 16:10) [24]
>
> > oxffff ©   (03.03.08 16:06) [22]
>
> ничего подобного... идеологически это уже не есть поведение
> progressbar, это есть поведение "я не повисло, я чего то
> делаю, но когда кончится не знаю"...


Вычисляешь значение прироста на уровне в зависимости от числа нод уровня. Заходишь на подуровень.
Вычисляешь значение прироста на подуровне в зависимости от числа нод подуровня с учетом прироста верхнего уровня и т.д.
Если дерево сбалансировано,то будет все достаточно гладко.


 
oxffff ©   (2008-03-03 16:39) [30]


> oxffff ©   (03.03.08 16:29) [29]


Прирост делаешь в Leaf nodes.


 
Сергей М. ©   (2008-03-03 16:41) [31]


> можно и по другому


Можно и по-другому.

Но, по условию,  XMLD.async:=false, никакие события парсера (если они имеются, это надо посмотреть) не используются, поэтому контролировать промежуточные результаты работы парсера до окончания этой работы в этой ситуации вряд ли представляется возможным. Если иначе - возьми да обозначь ключевые моменты автору, а мне оно нафих не надо за отсутствием интереса.


 
oxffff ©   (2008-03-03 16:48) [32]


> а мне оно нафих не надо за отсутствием интереса.


Солидарен. :)
А мне оно тоже  не нужно. :)
Я так в перерывах от ABAP захожу на любимый форум Delphimaster.
И отдыхаю от ABAPa. :)


 
Student :) ©   (2008-03-03 16:55) [33]

а как потоки создать? покажите примерчик


 
Ник   (2008-03-03 16:56) [34]

C oxffff ©   (03.03.08 16:17) [26] по
  oxffff ©   (03.03.08 16:48) [32] можно было бы и чате постебаться.


 
oxffff ©   (2008-03-03 16:58) [35]


> Ник   (03.03.08 16:56) [34]


Начни с себя. :)


 
Palladin ©   (2008-03-03 17:06) [36]


> oxffff ©   (03.03.08 16:29) [29]

как корректно приращивать максимальное значение, что бы процентное значение позиции не лезло назад это и ежу понятно, вот только местами оно может в такие дебри завести, что лучше фигней не страдать, а удовлетвориться империческими данными. которые оцениваются перед (!) началом выполнения задачи. как и поступает знаменитое окно копирование в windows.


 
Palladin ©   (2008-03-03 17:08) [37]

фу мля... :))) эмпирическими


 
Сергей М. ©   (2008-03-03 17:13) [38]

Из любопытства посмотрел на события объекта DOMDocument.

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


 
oxffff ©   (2008-03-03 17:14) [39]


> Palladin ©   (03.03.08 17:06) [36]


Это не фигня.
Это работающий вариант.
Который корректно отражает вклад каждого конечного (leaf) узла в процесс, каждый из которых проранжирован.
А оценить данные на этапе, так как делает Windows уходя в ступор, в ряде случаев неприемлемо. А здесь Run Time подстройка прироста в зависимости от уровня вложенности.


 
Palladin ©   (2008-03-03 17:17) [40]


> oxffff ©   (03.03.08 17:14) [39]

я"ж не казал, что у тебя фигня, я казал, что иногда лучше не стоит да и не отвергаю безразмерность прогресса... сам так делаю... просто пример ты привел с копированием неудачный :)
да и пользователи ругаются... умники блин...



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

Текущий архив: 2008.03.30;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.04 c
15-1203380076
Base
2008-02-19 03:14
2008.03.30
Как убрать у TPageControl бордюр?


4-1178095379
Ma[X]iM
2007-05-02 12:42
2008.03.30
Получение массива пикселей по хендлу картинки


2-1204346280
хаас
2008-03-01 07:38
2008.03.30
Вариантная запись


2-1204743273
timekiller
2008-03-05 21:54
2008.03.30
TDateTimePicker позиция курсора и текст после этой позиции


2-1204105403
DelphiN!
2008-02-27 12:43
2008.03.30
SQL с использованием цыклов и переменных