![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
XML и зависание главной формы
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
делать это ты собираешься до опупения, даже если док-т, к примеру, содержит какие-то ошибки и не может быть загружен.