Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Выполнение анимации во время обработки запроса Добавлено: 25.05.11 17:38  

Автор вопроса:  WHorse
Здравствуйте!

В приложении имеется участок кода, в котором происходит доступ к ресурсу в Интернете. Поскольку задержка от запроса до выдачи результата иногда доходит до 10 секунд, в течение которых приложение не отвечает на запросы, подгружаю в имеющийся picturebox картинку с анимацией ожидания. Весь код, включая подгрузку изображения, обрабатывается по событию button_click (сначала изображение, затем запрос в Интернет).

Уже несколько часов не могу добиться эффекта. Т.е. анимация не отображается, форма подвисает, затем отображается результат. Если использовать один из textbox с надписью "загрузка..." - тот же результат - надпись не отображается.

Насколько я понял, VB не умеет интерпретировать запросы в событии последовательно, он обрабатывает событие целиком, и пока его не отработает, на ранние и поздние по списку участки кода не разделяет? Я думаю происходит следующее: событие интерпретируется целиком вплоть до конца sub, форма вешается, затем отображается текст в textbox "загрузка...", затем за доли секунды меняется на текст результата запроса (что оказывется незаметным глазу).

Пробовал разбивать на два потока. Дошел до момента: "Невозможно использовать один элемент управления одновременно в нескольких потоках" и плюнул на это дело...

Подскажите, в каком направлении думать?
Спасибо!

Ответить

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

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



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #1
Добавлено: 25.05.11 17:59
Что используешь для закачки файла?

Ответить

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



Вопросов: 5
Ответов: 7
 Профиль | | #2 Добавлено: 25.05.11 18:07
HttpWebRequest

Ответить

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



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #3 Добавлено: 25.05.11 19:45
1. разбиваешь на два потока.
2. из второго нельзя работать с формой и ее элементами управления напрямую. используй Form.Invoke()

Ответить

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



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #4
Добавлено: 25.05.11 23:19
Если подойдёт просто надпись, то можно форсировать перерисовку посреди обработки события, но, согласен, при работе с сетью лучше использовать thread'ы

Ответить

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



Вопросов: 5
Ответов: 7
 Профиль | | #5 Добавлено: 26.05.11 18:34
Вырезал необходимый для выполнения код отдельно в форму.
Button1 - кнопка
BackgroundWorker1 - фоновый процесс
PictureBox1 - графический контейнер (с анимированным изображением)
TextBox1 - текстовое поле
TextBox2 - текстовое поле

В текущем исполнении информация о выполнении поиска в TextBox2 отображается, анимация в PictureBox1 выполняется, форма не подвисает. Выдает ошибку доступа к TextBox2.
При выполнении комментированных строк (без BackgroundWorker1)информация о выполнении поиска в TextBox2 отображается, анимация в PictureBox1 отображается (зависает), форма подвисает. Выполняется без ошибок, но криво, по всей видимости AccessControl() выполняется вне пределах потока, его инициировавшего.


  1. Public Class Form3
  2.  
  3.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  4.  
  5.         'Dim VUGONE_Stream As New System.Threading.Thread(AddressOf VUGONE_Stream_1)
  6.         'Dim LOADING_Stream As New System.Threading.Thread(AddressOf LOADING_Stream_1)
  7.         TextBox2.Text = "Подключаюсь к [www.vugone.info] ..."
  8.         PictureBox1.Image = My.Resources.Loading_1
  9.         'LOADING_Stream.Start()
  10.         'VUGONE_Stream.Start()
  11.         Me.BackgroundWorker1.RunWorkerAsync()
  12.  
  13.     End Sub
  14.  
  15.     'Private Sub LOADING_Stream_1()
  16.     '    PictureBox1.Image = My.Resources.Loading_1
  17.     'End Sub
  18.  
  19.     'Private Sub VUGONE_Stream_1()
  20.     '    If TextBox2.InvokeRequired = True Then
  21.     '        TextBox2.Invoke(New MethodInvoker(AddressOf AccessControl))
  22.     '    End If
  23.     'End Sub
  24.  
  25.     'Private Sub AccessControl()
  26.     '    Try
  27.     '        Dim VIN_URL As Net.HttpWebRequest = Net.HttpWebRequest.Create("http://www.vugone.info/base/find/?vin=" & TextBox1.Text)
  28.     '        Dim VIN_Response As Net.HttpWebResponse = VIN_URL.GetResponse()
  29.     '        Dim VIN_Stream As New IO.StreamReader(VIN_Response.GetResponseStream, System.Text.Encoding.GetEncoding("UTF-8"))
  30.     '        Dim VIN_Line As String = VIN_Stream.ReadToEnd
  31.     '        Dim VIN_Result_Nothing As New System.Text.RegularExpressions.Regex("Ничего не найдено")
  32.     '        Dim VIN_Result_Found As New System.Text.RegularExpressions.Regex("Результаты поиска:")
  33.     '        If (VIN_Result_Nothing.IsMatch(VIN_Line)) Then
  34.     '            TextBox2.Text = "[www.vugone.info]" & vbCrLf & "Транспортное средство в угоне не числится."
  35.     '        ElseIf (VIN_Result_Found.IsMatch(VIN_Line)) Then
  36.     '            TextBox2.Text = "[www.vugone.info]" & vbCrLf & "Внимание! Транспортное средство числится в угоне!"
  37.     '        Else
  38.     '            Exit Sub
  39.     '        End If
  40.     '    Catch
  41.     '        TextBox2.Text = "[Невозможно проверить транспортное средство на угон. Нет соединения с Интернетом.]"
  42.     '    End Try
  43.     '    PictureBox1.Image = Nothing
  44.     'End Sub
  45.  
  46.     Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
  47.         Try
  48.             Dim VIN_URL As Net.HttpWebRequest = Net.HttpWebRequest.Create("http://www.vugone.info/base/find/?vin=" & TextBox1.Text)
  49.             Dim VIN_Response As Net.HttpWebResponse = VIN_URL.GetResponse()
  50.             Dim VIN_Stream As New IO.StreamReader(VIN_Response.GetResponseStream, System.Text.Encoding.GetEncoding("UTF-8"))
  51.             Dim VIN_Line As String = VIN_Stream.ReadToEnd
  52.             Dim VIN_Result_Nothing As New System.Text.RegularExpressions.Regex("Ничего не найдено")
  53.             Dim VIN_Result_Found As New System.Text.RegularExpressions.Regex("Результаты поиска:")
  54.             If (VIN_Result_Nothing.IsMatch(VIN_Line)) Then
  55.                 TextBox2.Text = "[www.vugone.info]" & vbCrLf & "Транспортное средство в угоне не числится."
  56.             ElseIf (VIN_Result_Found.IsMatch(VIN_Line)) Then
  57.                 TextBox2.Text = "[www.vugone.info]" & vbCrLf & "Внимание! Транспортное средство числится в угоне!"
  58.             Else
  59.                 Exit Sub
  60.             End If
  61.         Catch
  62.             TextBox2.Text = "[Невозможно проверить транспортное средство на угон. Нет соединения с Интернетом.]"
  63.         End Try
  64.         PictureBox1.Image = Nothing
  65.     End Sub
  66. End Class


Всё равно не получается создать делегат для Invoke (BeginInvoke) без зависания формы!

Ответить

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



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #6
Добавлено: 26.05.11 18:41
Посмотри мою тему.
http://bit.pirit.info/forum/viewtopic.php?t=16619

Загружает файлы без зависания формы.

Ответить

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



Вопросов: 5
Ответов: 7
 Профиль | | #7 Добавлено: 27.05.11 12:29
Всем спасибо за советы! Заработало!
Помог пример http://www.cyberforum.ru/vb-net/thread278885.html

Ниже результирующий код:

  1. Public Class Form1
  2.  
  3.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  4.         TextBox2.Text = "Подключаюсь к [www.vugone.info] ..."
  5.         PictureBox1.Image = My.Resources.Loading_1
  6.         Me.BackgroundWorker1.RunWorkerAsync()
  7.     End Sub
  8.  
  9.     Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
  10.         Try
  11.             Dim VIN_URL As Net.HttpWebRequest = Net.HttpWebRequest.Create("http://www.vugone.info/base/find/?vin=" & TextBox1.Text)
  12.             Dim VIN_Response As Net.HttpWebResponse = VIN_URL.GetResponse()
  13.             Dim VIN_Stream As New IO.StreamReader(VIN_Response.GetResponseStream, System.Text.Encoding.GetEncoding("UTF-8"))
  14.             Dim VIN_Line As String = VIN_Stream.ReadToEnd
  15.             Dim VIN_Result_Nothing As New System.Text.RegularExpressions.Regex("Ничего не найдено")
  16.             Dim VIN_Result_Found As New System.Text.RegularExpressions.Regex("Результаты поиска:")
  17.             If (VIN_Result_Nothing.IsMatch(VIN_Line)) Then
  18.                 If TextBox2.InvokeRequired Then
  19.                     TextBox2.Invoke(New Threading.ThreadStart(AddressOf VUGONE_False))
  20.                 End If
  21.             ElseIf (VIN_Result_Found.IsMatch(VIN_Line)) Then
  22.                 If TextBox2.InvokeRequired Then
  23.                     TextBox2.Invoke(New Threading.ThreadStart(AddressOf VUGONE_True))
  24.                 End If
  25.             Else
  26.                 Exit Sub
  27.             End If
  28.         Catch
  29.             If TextBox2.InvokeRequired Then
  30.                 TextBox2.Invoke(New Threading.ThreadStart(AddressOf VUGONE_NoConnection))
  31.             End If
  32.         End Try
  33.         PictureBox1.Image = Nothing
  34.     End Sub
  35.  
  36.     Private Sub VUGONE_True()
  37.         TextBox2.Text = "[www.vugone.info]" & vbCrLf & "Внимание! Транспортное средство числится в угоне!"
  38.     End Sub
  39.  
  40.     Private Sub VUGONE_False()
  41.         TextBox2.Text = "[www.vugone.info]" & vbCrLf & "Транспортное средство в угоне не числится."
  42.     End Sub
  43.  
  44.     Private Sub VUGONE_NoConnection()
  45.         TextBox2.Text = "[Невозможно проверить транспортное средство на угон. Нет соединения с Интернетом.]"
  46.     End Sub
  47.  
  48. End Class

Ответить

Страница: 1 |

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



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