Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

XML и зависание главной формы


Страницы:   1 2 3

Student :) ©   (2008-03-03 13:23:00) 

Привет всем знатокам!!
вопрос есть некий 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 16:10:00) [21]


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

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


oxffff   (2008-03-03 16:09:00) [22]


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


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

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


oxffff   (2008-03-03 16:06:00) [23]


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


Не угадал. :)

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

Bar.position:=Trunc(value) ?

......

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


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


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


Не возражаю)


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


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


Palladin   (2008-03-03 15:56:00) [25]


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

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


oxffff   (2008-03-03 15:54:00) [26]


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


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

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


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


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


да ты что ?!

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


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

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

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


oxffff   (2008-03-03 15:40:00) [29]


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


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

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

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


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

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

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


DiamondShark   (2008-03-03 15:26:00) [31]


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

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

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

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

> XMLD.async:=false;

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


Student :)   (2008-03-03 15:21:00) [32]

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


clickmaker   (2008-03-03 15:20:00) [33]


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

20 маловато


Reindeer Moss Eater   (2008-03-03 15:19:00) [34]

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

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


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


> сесия!


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


Student :)   (2008-03-03 15:12:00) [36]

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


Kolan   (2008-03-03 14:17:00) [37]

Я что то не понимаю…

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


Student :)   (2008-03-03 14:14:00) [38]

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


Student :)   (2008-03-03 14:06:00) [39]

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


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


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


Судя по


> while not XMLD.load


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


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо