取消睡眠功能?

时间:2014-10-21 20:54:43

标签: vb.net vb6

如果我使用代码睡眠60秒并决定取消它我该怎么办呢?

似乎我曾几次使用睡眠,它必须在我面前完成才能阻止它。

vb.net或vb6中的代码示例可以正常使用任何一种语言。

编辑:

我正在做的只是制作一个位于系统托盘中的临时文件删除器,并在这么长时间后删除临时文件。允许用户将间隔设置为他们想要的间隔。如果他们想要24小时,那么将其设置为24小时,然后执行代码。

我知道我并不是唯一一个尝试这样做过的人。你们不明白我在做什么,这似乎很奇怪。

问题是如果他们想要停止操作就取消操作的唯一方法是关闭整个应用程序。

6 个答案:

答案 0 :(得分:2)

一旦你调用sleep,你就没有出路了。你不能强迫它停止。

我想出的最佳方法是sleep一次10秒,并检查是否要在每次发生10秒间隔时继续。

610 second次睡眠周期后,继续你的快乐方式。

答案 1 :(得分:0)

你无法取消'睡觉。它将线程暂停指定的时间,并且在时间到期之前不会返回。

正如MSFT .NET文档所示: 在指定的时间内,操作系统不会安排该线程执行。

http://msdn.microsoft.com/en-us/library/d00bd51t(v=vs.110).aspx

答案 2 :(得分:0)

您可能正在寻找System.Timers.Timer课程。你可以安排一个事件以某个间隔开火(到最近的毫秒;我不知道你从哪里获得" 60秒"间隔来自)。您将处理该事件并执行您需要执行的操作。如果你想"取消"在间隔发生之前,然后只需关闭计时器或重新启动它。这一切都发生在UI线程之外,因此您不会在此期间占用UI。如果您尝试在Elapsed事件中对用户界面执行某些操作,则需要使用Invoke来访问UI元素。

我不确切地知道你要做什么,但你几乎肯定需要Timer而不是Sleep

答案 3 :(得分:0)

应用程序的奇怪行为(要发送睡眠30分钟或1小时......)

无论如何,你问,我建议,但我已经知道我的答案会像问题一样奇怪,如果不是更多......所以,它不是一个真正的答案,只是另一个建议左右(和我希望会有更多)不知道睡眠需要什么,不确定以下内容是否有帮助。


使用两个全局布尔变量:

    Private isSleeping As Boolean = False ' or Protected or even Public...
    Private cancelSleeping As Boolean = False

然后使用Timer(也是全局变量)。 Timer.Tick由一个方法处理,该方法使用一些逻辑来存储isSleeping变量设置为True的时间。这可以通过使用以下任一方式来实现:

  1. 迭代器:Private sleepStep As Integer = 0。如果将Timer.Interval设置为1秒(1000),则每次处理Tick事件时将sleepStep增加1。对于一小时或睡眠模式,sleepStep将达到3600,定时器间隔为60000 ......
  2. a StopWatch(更好的恕我直言,System.Diagnostics):Private sleepSpan As StopWatch。您将在Tick事件处理程序中阅读sleepSpan.Elapsed(TimeSpan)。
  3. 所以你必须找到一种方法:

    • 初始化定时器间隔,如Public Sub SleepMe(ByVal Duration As Integer)。如果你想要一种非常精确的方法来打破睡眠模式,你必须为Interval设置一个非常小的值,但Timer.Tick本质上是非常不精确的。如果使用迭代器,请注意堆栈溢出(如果应用程序睡眠时间过长)
    • 在Timer.Tick(Timer.Enabled = False)中处理睡眠取消:在整个睡眠持续时间结束时取消。在调用睡眠取消时取消:通过读取cancelSleeping的值。

    Private Sub HandleTimerTick(sender As Object, e As System.EventArgs)
        Dim TimeElapsed As Boolean
    
        If cancelSleeping Then
            myTimer.Enabled = False
            isSleeping = False
            cancelSleeping = False
        Else
            ' ...
            ' Find here if the sleeping duration has elapsed
            ' ...
            If TimeElapsed Then
                myTimer.Enabled = False
                isSleeping = False
                cancelSleeping = False
            End If
        End If
    End Sub
    

    然后是睡眠方法:

    Public Sub SleepMe(ByVal NewDuration As Integer)
        ' For iterator :
        ' compute some duration control if required
        ' ...
        sleepStep = 0
        ' or for timespan :
        sleepSpan = New StopWatch()
    
        ' ... what else ?
        ' oh ! yes : initialize the Timer.Interval !
        ' how long ? It depends on you.. :/
        mySleepTimer.Interval = XXX
    
        ' ...
    
        ' Toggle sleep mode On.
        isSleeping = True
        cancelSleeping = False ' not really required here, 
        ' depending on how you update cancelSleeping in other part of the code..
        mySleepTimer.Enabled = True
    End Sub
    

    然后,对于在您的应用程序处于休眠状态时必须暂停的几乎任何事情,您必须检查isSleeping的值...... X_X

    这种方法通常限制性太强,太复杂,不够有用。有时候,将所有这些放在自定义类中会有所帮助,例如:

    • Public Sub mySleepClass.SleepMe(XXXX)
    • Public Sub mySleepClass.CancelSleep()
    • Public ReadOnly属性mySleepClass.IsSleeping()As Boolean
    • ...

    并使用这些成员来控制应用程序的行为方式。这看起来非常像一个背景工作者(除了浪费时间之外什么都不做)不是......

    不要忘记处理所有应该......

    我在交通游戏(道路,汽车,火车,飞机......)中使用了这个,我很久以前就已经做过了,直到我沉浸在代码的复杂性中。我结束了为每个对象实现自己的sleepModes,而不是在应用程序的核心中控制整个。但我对这种方法仍然不满意,如果有人有更好的建议,也许,我会尝试重新编写那个游戏......

答案 4 :(得分:0)

  • 将开始时间存储在变量中
  • 为其添加睡眠时间
  • 使用计时器控件检查睡眠时间是否过去

VB6中的示例项目:

'1 form with:
'  1 checkbox control: name=Check1  style=1 - Graphical
'  1 textbox control: name=Text1
'  1 timer control: name=Timer1
Option Explicit

Private mdatEnd As Double

Private Sub Check1_Click()
  Dim dblSleep As Double
  If Check1.Value = vbChecked Then
    dblSleep = Val(Text1.Text)
    mdatEnd = DateAdd("s", dblSleep, Now) 'add sleeptime (in seconds) to the current time
    Timer1.Interval = 1000                'check time every 1000 miliseconds (every second)
    Timer1.Enabled = True
  Else
    StopCheck
  End If
End Sub

Private Sub Timer1_Timer()
  Dim lngDiff As Long
  lngDiff = DateDiff("s", Now, mdatEnd)   'calculate remaining sleep time
  Caption = CStr(lngDiff)                 'show remaining sleep time
  If lngDiff <= 0 Then                    'show when sleep has finished
    MsgBox "sleep finished", vbOKOnly, "Sleep"
    StopCheck
  End If
End Sub

Private Sub StopCheck()
  Timer1.Enabled = False                'stop checking time
End Sub

文本框中的睡眠时间是睡眠的秒数。 如果您想在几分钟内指定它,那么您还必须将DateAdd更改为分钟,并且您可以将DateDiff和计时器间隔更改为分钟......对于任何其他句号分辨率也是如此

您也可以使用线程或简单的循环代替计时器控件,但一定要让它不要太紧

答案 5 :(得分:0)

您可以使用await Task.Delay(duration, cancellationToken)代替Thread.Sleep。