2013-11-13 3 views
0

У моей первой формы только что есть нотификация и опросы для некоторых результатов, если результаты соответствуют критериям и поднят сигнал тревоги, который открывает форму2.Кнопка на форме2 не реагирует

Моя проблема в том, что форма form2 открывается с результатами и воспроизводит сигнал тревоги, кнопка на странице, которую я хочу использовать для остановки воспроизведения mp3, не реагирует вообще.

Редактировать, я изменил свой код на то, что у меня есть. Форма 2 становится неактуальной при использовании фонового работника, как было предложено.

Вот form1

Public Class Form1 
Public Property waittimer As Integer = 60000 
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    BackgroundWorker1.WorkerSupportsCancellation = True 
    BackgroundWorker1.RunWorkerAsync() 
End Sub 

Private Sub NotifyIcon1_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles NotifyIcon1.MouseDoubleClick 

End Sub 

Private Sub ExitToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ExitToolStripMenuItem.Click 
    Form2.Close() 
    Application.Exit() 
End Sub 

Private Sub wait(ByVal interval As Integer) 
    Dim stopW As New Stopwatch 
    stopW.Start() 
    Do While stopW.ElapsedMilliseconds < interval 
     ' Allows your UI to remain responsive 
     Application.DoEvents() 
    Loop 
    stopW.Stop() 
End Sub 

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork 

    Dim firsttime As Boolean = True 
    Dim myForm2 As Form2 
    ' While True 

    Try 

     ' Create a request for the URL. 
     Dim request As WebRequest = _ 
      WebRequest.Create("http://example/example.aspx") 
     ' If required by the server, set the credentials. 
     request.Credentials = CredentialCache.DefaultCredentials 
     ' Get the response. 
     Dim response As WebResponse = request.GetResponse() 
     ' Display the status. 
     Console.WriteLine(CType(response, HttpWebResponse).StatusDescription) 
     ' Get the stream containing content returned by the server. 
     Dim dataStream As Stream = response.GetResponseStream() 
     ' Open the stream using a StreamReader for easy access. 
     Dim reader As New StreamReader(dataStream) 
     ' Read the content. 
     Dim responseFromServer As String = reader.ReadToEnd() 
     ' Display the content. 
     Console.WriteLine(responseFromServer) 
     ' Clean up the streams and the response. 
     reader.Close() 
     response.Close() 

     Dim responseArray() As String 


     responseArray = Split(responseFromServer, "|") 

     Form2.maxcalls = responseArray(0) 
     Form2.cph = responseArray(1) 
     Form2.mht = responseArray(2) 
     Form2.alarm = responseArray(3) 

     'Form2.Show() 
     If Form2.alarm = True Then 
      myForm2 = New Form2() 
      Form2.Show() 
     End If 
     Application.DoEvents() 
     System.Threading.Thread.Sleep(waittimer) 
     ' wait(waittimer) 

     If waittimer = 1800000 Then 
      waittimer = 60000 
     End If 

    Catch ex As Exception 

    End Try 
    ' End While 
End Sub 
End Class 

Вот form2

Public Class Form2 
Public Property maxcalls As Integer 
Public Property cph As Integer 
Public Property mht As Integer 
Public Property alarm As Boolean 
Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    InitializeComponent() 
    startsong() 

End Sub 


Sub startsong() 
    MHTvalue.Text = mht.ToString 
    Maxcallsvalue.Text = maxcalls 
    CPHvalue.Text = cph 
    Dim audio As New AudioFile("C:\example\Help.mp3") 
    audio.Play() 
    Application.DoEvents() 
End Sub 


Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    MessageBox.Show("test") 
End Sub 

End Class

Любая помощь будет принята с благодарностью.

+1

Вы определенно должны ** НЕ ** быть с помощью 'Хотя true' цикл, как, что в основной Пользовательский интерфейс! Переместите эту петлю опроса в фоновый поток. Посмотрите на элемент BackgroundWorker(), чтобы выполнить эту задачу. Я думаю, вы обнаружите, что, как только ваш основной пользовательский интерфейс будет освобожден из этого цикла, и что бы ни было внутри вашего метода 'wait()', ваша форма начнет вести себя так, как вы ожидаете ... –

+0

Спасибо за ваш ответ, я я дам, что a go – Imsopov

+0

Form2 стал неактуальным, когда я изменил свой код, чтобы иметь фонового работника – Imsopov

ответ

1

Попробуйте это для Form1. Обратите внимание, есть новый небольшой вспомогательный класс в нижней части:

Imports System.Net 
Imports System.IO 
Public Class Form1 

    Private WithEvents Tmr As New Timer 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     Tmr.Enabled = False 
     Tmr.Interval = TimeSpan.FromSeconds(60).TotalMilliseconds 

     BackgroundWorker1.RunWorkerAsync() 
    End Sub 

    Private Sub NotifyIcon1_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles NotifyIcon1.MouseDoubleClick 

    End Sub 

    Private Sub ExitToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ExitToolStripMenuItem.Click 
     Application.Exit() 
    End Sub 

    Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork 
     Try 
      ' Create a request for the URL. 
      Dim request As WebRequest = _ 
       WebRequest.Create("http://example/example.aspx") 
      ' If required by the server, set the credentials. 
      request.Credentials = CredentialCache.DefaultCredentials 
      ' Get the response. 
      Dim response As WebResponse = request.GetResponse() 
      ' Display the status. 
      Console.WriteLine(CType(response, HttpWebResponse).StatusDescription) 
      ' Get the stream containing content returned by the server. 
      Dim dataStream As Stream = response.GetResponseStream() 
      ' Open the stream using a StreamReader for easy access. 
      Dim reader As New StreamReader(dataStream) 
      ' Read the content. 
      Dim responseFromServer As String = reader.ReadToEnd() 
      ' Display the content. 
      Console.WriteLine(responseFromServer) 
      ' Clean up the streams and the response. 
      reader.Close() 
      response.Close() 

      Dim responseArray() As String 
      responseArray = Split(responseFromServer, "|") 

      Dim D As New Data 
      D.maxcalls = responseArray(0) 
      D.cph = responseArray(1) 
      D.mht = responseArray(2) 
      D.alarm = responseArray(3) 
      e.Result = D 
     Catch ex As Exception 
      e.Result = Nothing 
     End Try 
    End Sub 

    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted 
     If Not IsNothing(e.Result) Then 
      Dim D As Data = DirectCast(e.Result, Data) 
      If D.alarm Then 
       Form2.startsong(D) 
      End If 
     End If 
     Tmr.Start() 
    End Sub 

    Private Sub Tmr_Tick(sender As Object, e As System.EventArgs) Handles Tmr.Tick 
     Tmr.Stop() 
     BackgroundWorker1.RunWorkerAsync() 
    End Sub 

End Class 

Public Class Data 
    Public Property maxcalls As Integer 
    Public Property cph As Integer 
    Public Property mht As Integer 
    Public Property alarm As Boolean 
End Class 

Form2 теперь становится:

Public Class Form2 

    Public Sub startsong(ByVal D As Data) 
     Me.Show() 
     MHTvalue.Text = D.mht.ToString 
     Maxcallsvalue.Text = D.maxcalls 
     CPHvalue.Text = D.cph 
     Dim audio As New AudioFile("C:\example\Help.mp3") 
     audio.Play() 
    End Sub 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     MessageBox.Show("test") 
    End Sub 

End Class 
Смежные вопросы