Страница: 1 | 
		
		
			
	
		 
		
			
  
    |   | 
    
Вопрос: Выполнение анимации во время обработки запроса
     | 
    
Добавлено: 25.05.11 17:38
     | 
      | 
  
		
			
			  
    
      
Автор вопроса:   WHorse
       | 
    
    
      
Здравствуйте!
 
 
В приложении имеется участок кода, в котором происходит доступ к ресурсу в Интернете. Поскольку задержка от запроса до выдачи результата иногда доходит до 10 секунд, в течение которых приложение не отвечает на запросы, подгружаю в имеющийся picturebox картинку с анимацией ожидания. Весь код, включая подгрузку изображения, обрабатывается по событию button_click (сначала изображение, затем запрос в Интернет).
 
 
Уже несколько часов не могу добиться эффекта. Т.е. анимация не отображается, форма подвисает, затем отображается результат. Если использовать один из textbox с надписью "загрузка..." - тот же результат - надпись не отображается.
 
 
Насколько я понял, VB не умеет интерпретировать запросы в событии последовательно, он обрабатывает событие целиком, и пока его не отработает, на ранние и поздние по списку участки кода не разделяет? Я думаю происходит следующее: событие интерпретируется целиком вплоть до конца sub, форма вешается, затем отображается текст в textbox "загрузка...", затем за доли секунды меняется на текст результата запроса (что оказывется незаметным глазу).
 
 
Пробовал разбивать на два потока. Дошел до момента: "Невозможно использовать один элемент управления одновременно в нескольких потоках" и плюнул на это дело...
 
 
Подскажите, в каком направлении думать?
 
Спасибо!
Ответить
        | 
    
  
		
			
		
		
			
		
	  
	  
	  
	  
	  
    
      
Номер ответа: 5 Автор ответа:
   WHorse
  
        
  Вопросов: 5 Ответов: 7 
       | 
      
 Профиль |  | #5
       | 
Добавлено:  26.05.11 18:34
       | 
    
    
      
Вырезал необходимый для выполнения код отдельно в форму.
 
Button1 - кнопка
 
BackgroundWorker1 - фоновый процесс
 
PictureBox1 - графический контейнер (с анимированным изображением)
 
TextBox1 - текстовое поле
 
TextBox2 - текстовое поле
 
 
В текущем исполнении информация о выполнении поиска в TextBox2 отображается, анимация в PictureBox1 выполняется, форма не подвисает. Выдает ошибку доступа к TextBox2.
 
При выполнении комментированных строк (без BackgroundWorker1)информация о выполнении поиска в TextBox2 отображается, анимация в PictureBox1 отображается (зависает), форма подвисает. Выполняется без ошибок, но криво, по всей видимости AccessControl() выполняется вне пределах потока, его инициировавшего.
 
 
 
- Public Class Form3
  
-  
 
-     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  
-  
 
-         
 
-         
 
-         TextBox2.Text = "Подключаюсь к [www.vugone.info] ..."
  
-         PictureBox1.Image = My.Resources.Loading_1
  
-         
 
-         
 
-         Me.BackgroundWorker1.RunWorkerAsync()
  
-  
 
-     End Sub
  
-  
 
-     
 
-     
 
-     
 
-  
 
-     
 
-     
 
-     
 
-     
 
-     
 
-  
 
-     
 
-     
 
-     
 
-     
 
-     
 
-     
 
-     
 
-     
 
-     
 
-     
 
-     
 
-     
 
-     
 
-     
 
-     
 
-     
 
-     
 
-     
 
-     
 
-     
 
-  
 
-     Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
  
-         Try
  
-             Dim VIN_URL As Net.HttpWebRequest = Net.HttpWebRequest.Create("http://www.vugone.info/base/find/?vin=" & TextBox1.Text)
  
-             Dim VIN_Response As Net.HttpWebResponse = VIN_URL.GetResponse()
  
-             Dim VIN_Stream As New IO.StreamReader(VIN_Response.GetResponseStream, System.Text.Encoding.GetEncoding("UTF-8"))
  
-             Dim VIN_Line As String = VIN_Stream.ReadToEnd
  
-             Dim VIN_Result_Nothing As New System.Text.RegularExpressions.Regex("Ничего не найдено")
  
-             Dim VIN_Result_Found As New System.Text.RegularExpressions.Regex("Результаты поиска:")
  
-             If (VIN_Result_Nothing.IsMatch(VIN_Line)) Then
  
-                 TextBox2.Text = "[www.vugone.info]" & vbCrLf & "Транспортное средство в угоне не числится."
  
-             ElseIf (VIN_Result_Found.IsMatch(VIN_Line)) Then
  
-                 TextBox2.Text = "[www.vugone.info]" & vbCrLf & "Внимание! Транспортное средство числится в угоне!"
  
-             Else
  
-                 Exit Sub
  
-             End If
  
-         Catch
  
-             TextBox2.Text = "[Невозможно проверить транспортное средство на угон. Нет соединения с Интернетом.]"
  
-         End Try
  
-         PictureBox1.Image = Nothing
  
-     End Sub
  
- End Class
  
  
 
 
Всё равно не получается создать делегат для Invoke (BeginInvoke) без зависания формы!
Ответить
        | 
    
  
	  
	  Страница: 1 | 
 
		
			Поиск по форуму