【问题标题】:Random delay in seconds from numericupdown in VB.NetVB.Net中numericupdown的随机延迟(以秒为单位)
【发布时间】:2014-12-21 22:19:31
【问题描述】:

我有一个桌面 winforms 应用代码:

    Sub Delay(ByVal dblSecs As Double)
        Const OneSec As Double = 1.0# / (1440.0# * 60.0#)
        Dim dblWaitTil As Date
        Now.AddSeconds(OneSec)
        dblWaitTil = Now.AddSeconds(OneSec).AddSeconds(dblSecs)
        Do Until Now > dblWaitTil
            Application.DoEvents()
        Loop
    End Sub

Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
Webbrowser1.Navigate(TextBox1.Text)
Delay(Val(DelayText.Text))
end sub

我需要设置最大值。延迟,通过输入秒在文本框中相同。 我需要这是随机延迟数,所以我在这里堆叠,感谢您更正我的代码。 另外,如果可以在NumericUpDown 中实现它,因为我发现一些主题说文本框文本属性与NumericUpDown 不同,但我更喜欢它。

【问题讨论】:

    标签: vb.net random delay


    【解决方案1】:

    您可以使用一个中间类来为您完成大部分工作

    此类将采用 WebBrowser,附加到它的某些事件,并会定期刷新(取决于 MinimumWait / MaximumWait)

    由于它使用线程,它还检查是否需要调用用户控件来刷新它,如果是,则调用自定义刷新委托

    Public Class Refresher
        Protected Delegate Sub RefreshNavigationDelegate(browser As WebBrowser)
    
        Protected Sub RefreshNavigation(browser As WebBrowser)
            If browser.InvokeRequired Then
                browser.Invoke(New RefreshNavigationDelegate(AddressOf RefreshNavigation), browser)
                Return
            End If
            browser.Refresh(WebBrowserRefreshOption.Completely)
        End Sub
    
        Private _isBusy As Boolean = False
        Public Property IsBusy As Boolean
            Get
                Return _isBusy
            End Get
            Protected Set(value As Boolean)
                If _isBusy = value Then
                    Return
                End If
                _isBusy = value
            End Set
        End Property
    
        Public Property MinimumWait As Integer = 2000
    
        Public Property MaximumWait As Integer = 10000
    
        Private refreshThread As Thread = Nothing
    
        Private _browser As WebBrowser
        Public Property Browser As WebBrowser
            Get
                Return _browser
            End Get
            Set(value As WebBrowser)
                If Object.Equals(_browser, value) Then
                    Return
                End If
                StopRefresh()
                If _browser IsNot Nothing Then
                    RemoveHandler Browser.DocumentCompleted, AddressOf DocumentComplete
                    RemoveHandler Browser.Navigating, AddressOf Navigating
                End If
                _browser = value
                If _browser IsNot Nothing Then
                    AddHandler Browser.DocumentCompleted, AddressOf DocumentComplete
                    AddHandler Browser.Navigating, AddressOf Navigating
                    AddHandler Browser.ProgressChanged, AddressOf ProgressChanged
                End If
                StartRefresh()
            End Set
        End Property
    
        Protected Sub ProgressChanged(sender As Object, e As WebBrowserProgressChangedEventArgs)
            IsBusy = e.CurrentProgress > 0 AndAlso e.CurrentProgress < e.MaximumProgress
        End Sub
    
        Protected Sub DocumentComplete(sender As Object, e As WebBrowserDocumentCompletedEventArgs)
            IsBusy = False
        End Sub
    
        Protected Sub Navigating(sender As Object, e As WebBrowserNavigatingEventArgs)
            IsBusy = True
        End Sub
    
        Public Sub StartRefresh()
            If refreshThread IsNot Nothing Then
                Return
            End If
            refreshThread = New Thread(AddressOf DoRandomRefreshes)
            refreshThread.Start()
        End Sub
    
        Public Sub StopRefresh()
            If refreshThread Is Nothing Then
                Return
            End If
            refreshThread.Abort()
            refreshThread = Nothing
        End Sub
    
        Protected Overridable Sub DoRandomRefreshes()
            Dim randomGenerator As New Random()
    
            While Not refreshThread.ThreadState = ThreadState.AbortRequested
                Dim newTimeout As Integer = MinimumWait + randomGenerator.Next(MaximumWait - MinimumWait)
                Thread.Sleep(newTimeout)
                If Not IsBusy Then
                    RefreshNavigation(Browser)
                End If
            End While
        End Sub
    
        Public Sub New()
    
        End Sub
    End Class
    

    然后你可以在你的表单中使用它:

    Public Class Form1
        Dim myRefresher As Refresher = New Refresher()
    
        Private Sub tsbGo_Click(sender As Object, e As EventArgs) Handles tsbGo.Click
            WebBrowser1.Navigate(txtUrl.Text)
        End Sub
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            myRefresher.Browser = WebBrowser1
        End Sub
    
        Private Sub txtMin_TextChanged(sender As Object, e As EventArgs) Handles txtMin.TextChanged
            Dim int As Integer = 0
            If Integer.TryParse(txtMin.Text, int) Then
                myRefresher.MinimumWait = int
            End If
        End Sub
    
        Private Sub txtMax_TextChanged(sender As Object, e As EventArgs) Handles txtMax.TextChanged
            Dim int As Integer = 0
            If Integer.TryParse(txtMax.Text, int) Then
                myRefresher.MaximumWait = int
            End If
        End Sub
    End Class
    

    【讨论】:

    • 非常感谢;我去试试看它是否能胜任;我会标记你的答案。顺便说一句新年快乐:)
    • 我试图实现你写的所有类,但我在这里遇到了一些错误:'AbortRequested' 不是'System.Diagnostics.ThreadState' 的成员。 yopu能帮忙吗?谢谢
    • 您的目标是什么版本的 .net?它应该来自我认为的System.Threading 命名空间。最坏的情况,您可以简单地创建一个具有“StopRequested”的私有布尔值,然后检查它是否不正确,这也应该有效
    • 我从属性中获得了 4.5 个 .Net 目标,因此我将 Private boalen 声明为 stoprequest 但同样的错误,请参见图片:postimg.org/image/6188b0l6zthansk fpor 任何解决方案
    • 应该来自System.Threading.ThreadState.AbortRequested
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多