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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.045 c
2-1204027484
Эрни
2008-02-26 15:04
2008.03.30
найти каталог


15-1203061536
DVM
2008-02-15 10:45
2008.03.30
Какой Linux мне поставить?


2-1204115874
ryden
2008-02-27 15:37
2008.03.30
Как получить последнюю строку из таблици в БД


15-1203346898
Ega23
2008-02-18 18:01
2008.03.30
Поделитесь соображениями по реализации трёх-звенки


2-1204537212
Sonia
2008-03-03 12:40
2008.03.30
BEGIN expected but INTERFACE found





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