ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Xml и зависание главной формы
  #1  
Старый 03.03.2008, 14:16
Student :)
Участник форума
Регистрация: 09.02.2007
Сообщений: 202
Провел на форуме:
537148

Репутация: 9
Отправить сообщение для Student :) с помощью ICQ
Question Xml и зависание главной формы

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

PHP код:
procedure TForm1.Button1Click(SenderTObject);
var
 
//CityID: string;
 
CoDocCoDOMDocument;
 
XMLDDOMDocument;
 
rIXMLDOMElement;
 
FNodeIXMLDOMNode;
 
i,yinteger;
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
 
Ответить с цитированием

  #2  
Старый 03.03.2008, 14:55
madnet
Умиротворенн
Регистрация: 09.12.2004
Сообщений: 996
Провел на форуме:
2386719

Репутация: 1384


Отправить сообщение для madnet с помощью ICQ
По умолчанию

Оттрассируй эти 2 строчки
while not XMLD.load(URL) do
Application.ProcessMessages;

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

Здесь варианта 2
1) Вынеси этот кусок кода в отдельный поток

2) Посмотри по документации может у твоего класса есть метод обработки времени загрузки.
__________________

http://madnet.name - madnet - blog | homepage (Мысли, релизы, скрипты, софт)

http://antichat.ru - Лучший сайт по безопасности
irc.antichat.ru:7771 #antichat - общение online
ГАРАНТ ФОРУМА
 
Ответить с цитированием

  #3  
Старый 03.03.2008, 14:58
Student :)
Участник форума
Регистрация: 09.02.2007
Сообщений: 202
Провел на форуме:
537148

Репутация: 9
Отправить сообщение для Student :) с помощью ICQ
По умолчанию

спасибо
 
Ответить с цитированием

  #4  
Старый 03.03.2008, 15:01
madnet
Умиротворенн
Регистрация: 09.12.2004
Сообщений: 996
Провел на форуме:
2386719

Репутация: 1384


Отправить сообщение для madnet с помощью ICQ
По умолчанию

Можешь еще воспользоваться режимами загрузки
XMLD.Async := True;

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

http://madnet.name - madnet - blog | homepage (Мысли, релизы, скрипты, софт)

http://antichat.ru - Лучший сайт по безопасности
irc.antichat.ru:7771 #antichat - общение online
ГАРАНТ ФОРУМА
 
Ответить с цитированием

  #5  
Старый 03.03.2008, 15:15
Student :)
Участник форума
Регистрация: 09.02.2007
Сообщений: 202
Провел на форуме:
537148

Репутация: 9
Отправить сообщение для Student :) с помощью ICQ
По умолчанию

может так
XMLD.load(URL);
for I:=0 to 20 do
begin
Application.ProcessMessages;
end;
 
Ответить с цитированием

  #6  
Старый 03.03.2008, 16:31
z01b
Постоянный
Регистрация: 05.01.2007
Сообщений: 508
Провел на форуме:
2360904

Репутация: 1393


По умолчанию

Пихай код в процедуру и запусти отдельный поток.
ИМХО лучший вариант.
 
Ответить с цитированием

  #7  
Старый 03.03.2008, 16:35
madnet
Умиротворенн
Регистрация: 09.12.2004
Сообщений: 996
Провел на форуме:
2386719

Репутация: 1384


Отправить сообщение для madnet с помощью ICQ
По умолчанию

Цитата:
Сообщение от Student :)  
может так
XMLD.load(URL);
for I:=0 to 20 do
begin
Application.ProcessMessages;
end;
Ты не понял, в синхронном режиме, что бы ты не писал, пока не выполнится XMLD.load(URL); дальше не пойдет.
__________________

http://madnet.name - madnet - blog | homepage (Мысли, релизы, скрипты, софт)

http://antichat.ru - Лучший сайт по безопасности
irc.antichat.ru:7771 #antichat - общение online
ГАРАНТ ФОРУМА
 
Ответить с цитированием

  #8  
Старый 03.03.2008, 17:54
Student :)
Участник форума
Регистрация: 09.02.2007
Сообщений: 202
Провел на форуме:
537148

Репутация: 9
Отправить сообщение для Student :) с помощью ICQ
По умолчанию

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

  #9  
Старый 03.03.2008, 18:11
z01b
Постоянный
Регистрация: 05.01.2007
Сообщений: 508
Провел на форуме:
2360904

Репутация: 1393


По умолчанию

Цитата:
Сообщение от Student :)  
а как потоки создать? покажите примерчик
Код:
The CreateRemoteThread function creates a thread that runs in the address space of another process. 

HANDLE CreateRemoteThread(

    HANDLE hProcess,	// handle to process to create thread in  
    LPSECURITY_ATTRIBUTES lpThreadAttributes,	// pointer to thread security attributes 
    DWORD dwStackSize,	// initial thread stack size, in bytes
    LPTHREAD_START_ROUTINE lpStartAddress,	// pointer to thread function 
    LPVOID lpParameter,	// pointer to argument for new thread  
    DWORD dwCreationFlags,	// creation flags 
    LPDWORD lpThreadId 	// pointer to returned thread identifier 
   );	
 

Parameters

hProcess

Identifies the process in which the thread is to be created. 
Windows NT: The handle must have PROCESS_CREATE_THREAD access. For more information, see Process Objects. 

lpThreadAttributes

Pointer to a SECURITY_ATTRIBUTES structure that specifies a security descriptor for the new thread and determines whether child processes can inherit the returned handle. If lpThreadAttributes is NULL, the thread gets a default security descriptor and the handle cannot be inherited.

dwStackSize

Specifies the size, in bytes, of the stack for the new thread. If this value is zero, the stack size defaults to the same size as that of the primary thread of the process. The stack is allocated automatically in the memory space of the process and is freed when the thread terminates. Note that the stack size grows as necessary. 

lpStartAddress

Points to the starting address of the new thread. This is typically the address of a function declared with the WINAPI calling convention that never returns and that accepts a single 32-bit pointer as an argument. 

lpParameter

Points to a single 32-bit value passed to the thread. 

dwCreationFlags

Specifies additional flags that control the creation of the thread. If the CREATE_SUSPENDED flag is specified, the thread is created in a suspended state and will not run until the ResumeThread function is called. If this value is zero, the thread runs immediately after creation. 

lpThreadId

Points to a 32-bit variable that receives the thread identifier.
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зависание с WiFi в Windows _Great_ Windows 12 31.12.2007 18:36



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ