Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Зависание во время выполнения запроса к узлу Добавлено: 31.10.10 00:00  

Автор вопроса:  MYSTERIOR | Web-сайт: XXX | ICQ: 227369659 
Здравствуйте!
Есть программа которая по таймеру делает запрос к XML с узла в интернете используя MSXML30.dll

Проблема заключается в том, что пока ожидается ответ, видимо, программа подвисает. Не уверен что иэто во время запрова но скорее всего.

Вопрос: как сделать таймер асинхронным? То есть запустить функцию на исполнение и не ждать пока она закончится, а пережать управление всем компонентам вновь?

Ответить

  Ответы Всего ответов: 27  

Номер ответа: 1
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #1 Добавлено: 31.10.10 13:11
запускай мошню в другом потоке и всех делов

Ответить

Номер ответа: 2
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #2 Добавлено: 31.10.10 13:18
MSXML30.dll

я так подозреваю, что речь идет не о .NET...

Ответить

Номер ответа: 3
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #3
Добавлено: 31.10.10 19:31
надо в вызове Open указать, что запрос асинхронный

Ответить

Номер ответа: 4
Автор ответа:
 MYSTERIOR



ICQ: 227369659 

Вопросов: 31
Ответов: 96
 Web-сайт: XXX
 Профиль | | #4
Добавлено: 31.10.10 23:01
AgentFire, а как это реализовать? Может есть пример? Искал в гугле по запросу об асинхронности - не нашел

EROS, именно - VB6.0

Winand, а как это сделать? есть практическая реализация примера?

Ответить

Номер ответа: 5
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #5
Добавлено: 01.11.10 03:37
например
  1. Option Explicit
  2.  
  3. Private Sub Command1_Click()
  4.     Dim xmlhttp As Object, timing As Long
  5.     Set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP")
  6.     xmlhttp.open "GET", "http://nnm.ru", True
  7.     xmlhttp.send
  8.     While xmlhttp.readyState <> 4
  9.         xmlhttp.waitForResponse 1
  10.         timing = timing + 1
  11.         Caption = timing
  12.         DoEvents
  13.     Wend
  14.     Caption = timing & " done"
  15.     If xmlhttp.Status = 200 Then _
  16.         MsgBox xmlhttp.responseText _
  17.     Else MsgBox "status is " & xmlhttp.Status
  18. End Sub

Ответить

Номер ответа: 6
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #6 Добавлено: 01.11.10 10:28
MYSTERIOR пишет:
AgentFire, а как это реализовать? Может есть пример?
есть конечно:
  1. ...
  2. Dim T As New Threading.Thread(AddressOf AnotherThread)
  3. T.Start() 'вышеуказанная процедура запускается в другом потоке, а выполнение этого продолжается незамедлительно
  4. ...
  5.  
  6. Sub AnotherThread()
  7.     Do
  8.         'бесконечный цикл, например
  9.         Threading.Thread.Sleep(1)
  10.     Loop
  11. End Sub

Ответить

Номер ответа: 7
Автор ответа:
 MYSTERIOR



ICQ: 227369659 

Вопросов: 31
Ответов: 96
 Web-сайт: XXX
 Профиль | | #7
Добавлено: 01.11.10 10:51
Winand, кажется получилось! Только вот чем теперь этот XML разобрать ( Раньше я использовал свойство xmlDoc.selectNodes и вытаскивал нужные мне данные, а MSXML2.ServerXMLHTTP такого не поддерживает...

AgentFire, кажется это для дот-нета, верно? Решил что надо образовываться - вот с утра ставлю NET 2010 - там говорят есть некий BackgroundWorker через который проблема задач в фоновом режиме решается максимально элегантно)

Ответить

Номер ответа: 8
Автор ответа:
 MYSTERIOR



ICQ: 227369659 

Вопросов: 31
Ответов: 96
 Web-сайт: XXX
 Профиль | | #8
Добавлено: 01.11.10 11:10
Winand, сейчас проверил - все равно виснет зараза кажется во время выполнения запроса к узлу...

Ответить

Номер ответа: 9
Автор ответа:
 MYSTERIOR



ICQ: 227369659 

Вопросов: 31
Ответов: 96
 Web-сайт: XXX
 Профиль | | #9
Добавлено: 01.11.10 14:02
Winand, вот код. Поставь на форму timer1 и text1 и попробуй постоянно небыстро перетаскивать форму. ПРи каждом срабатываении таймера форма будет на секунду "подвисать"! Как победить эту проблему? Замучатся весь, а из мультитрединга не работает XML почему то...

  1. Private Sub Timer1_Timer()
  2.      Dim xmlhttp As Object, timing As Long
  3.      Set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP")
  4.      xmlhttp.open "GET", "http://nnm.ru", True
  5.      xmlhttp.send
  6.      While xmlhttp.readyState <> 4
  7.          xmlhttp.waitForResponse 1
  8.          timing = timing + 1
  9.          Caption = timing
  10.          DoEvents
  11.      Wend
  12.      Caption = timing & " done"
  13.      If xmlhttp.Status = 200 Then
  14.          Text1.Text = Text1.Text + Mid(xmlhttp.responseText, 1, 10) + vbCrLf
  15.      Else
  16.         MsgBox "status is " & xmlhttp.Status
  17.     End If
  18. End Sub

Ответить

Номер ответа: 10
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #10 Добавлено: 01.11.10 14:25
MYSTERIOR пишет:
Решил что надо образовываться - вот с утра ставлю NET 2010
Корректное решение.

Учитесь дотнету! там можно сделать так:
  1. Using WC As New WebClient
  2.     Dim ServerResponce = WC.DownloadString("http://nnm.ru") ' Можно и "гет" указать при необходимости
  3. End Using
и получим весь текст сайта одной строкой без левых компонентов

Ответить

Номер ответа: 11
Автор ответа:
 MYSTERIOR



ICQ: 227369659 

Вопросов: 31
Ответов: 96
 Web-сайт: XXX
 Профиль | | #11
Добавлено: 01.11.10 14:57
AgentFire, нельзя дотнет( нужна совместимость( Что ж делать с этим залипанием дурацким?((

Winand, вот код. Поставь на форму timer1 и text1 и попробуй постоянно небыстро перетаскивать форму. ПРи каждом срабатываении таймера форма будет на секунду "подвисать"! Как победить эту проблему? Замучатся весь, а из мультитрединга не работает XML почему то...

   1. Private Sub Timer1_Timer()
   2. Dim xmlhttp As Object, timing As Long
   3. Set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP";)
   4. xmlhttp.open "GET", "http://nnm.ru", True
   5. xmlhttp.send
   6. While xmlhttp.readyState <> 4
   7. xmlhttp.waitForResponse 1
   8. timing = timing + 1
   9. Caption = timing
  10. DoEvents
  11. Wend
  12. Caption = timing & " done"
  13. If xmlhttp.Status = 200 Then
  14. Text1.Text = Text1.Text + Mid(xmlhttp.responseText, 1, 10) + vbCrLf
  15. Else
  16. MsgBox "status is " & xmlhttp.Status
  17. End If
  18. End Sub

Ответить

Номер ответа: 12
Автор ответа:
 MYSTERIOR



ICQ: 227369659 

Вопросов: 31
Ответов: 96
 Web-сайт: XXX
 Профиль | | #12
Добавлено: 01.11.10 14:59
Всмысле вот код в читабельном виде - на всякий случай чтоб не потерялся в треде

  1. Private Sub Timer1_Timer()
  2.      Dim xmlhttp As Object, timing As Long
  3.      Set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP")
  4.      xmlhttp.open "GET", "http://nnm.ru", True
  5.      xmlhttp.send
  6.      While xmlhttp.readyState <> 4
  7.          xmlhttp.waitForResponse 1
  8.          timing = timing + 1
  9.          Caption = timing
  10.          DoEvents
  11.      Wend
  12.      Caption = timing & " done"
  13.      If xmlhttp.Status = 200 Then
  14.          Text1.Text = Text1.Text + Mid(xmlhttp.responseText, 1, 10) + vbCrLf
  15.      Else
  16.         MsgBox "status is " & xmlhttp.Status
  17.     End If
  18. End Sub

Ответить

Номер ответа: 13
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #13 Добавлено: 01.11.10 15:42
MYSTERIOR пишет:
нельзя дотнет( нужна совместимость(
с чем нужна? с win95 ?

Ответить

Номер ответа: 14
Автор ответа:
 MYSTERIOR



ICQ: 227369659 

Вопросов: 31
Ответов: 96
 Web-сайт: XXX
 Профиль | | #14
Добавлено: 01.11.10 15:44
xp хотя бы без дотнетов

Ответить

Номер ответа: 15
Автор ответа:
 VbStarter



ICQ: 357911808 

Вопросов: 118
Ответов: 1340
 Web-сайт: moscowdevils.ru
 Профиль | | #15
Добавлено: 01.11.10 15:44
с машинами без фреймворка последнего-предпоследнего...

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам