none
vb.net 如何暂停一个线程而不是休眠一个线程 RRS feed

  • 问题

  • 请教各位高手一个问题,我想在程序一段代码执行到一半的时候,暂停继续执行,等待几秒钟然后继续执行,但是用System.Threading.Thread.Sleep()会让整个线程休眠了,如何做到只是暂停而不是休眠呢?

    例如:
     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
              ****这里是调用某种方法播放某个音乐的代码,音乐长为5秒钟
             ****这里是暂停5秒钟的代码,但是不休眠,否则音乐也会停止。
              ****这里是下面的代码5秒钟后继续执行的。
       End Sub

    各位高手如何实现呢?

    2009年5月4日 8:18

答案

  • Hi 小小程序,

    我还有另外一个技巧也许对你有帮助,请看下面的代码:
    Public Class Form1
        Private form2 As Form = New Form()

        Public Sub New()
            InitializeComponent()
            Timer1.Interval = 5000
            Timer1.Enabled = True
            form2.Visible = False
            form2.Size = New Size(0, 0)
            form2.FormBorderStyle = Windows.Forms.FormBorderStyle.None
            form2.ShowInTaskbar = False
        End Sub

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            '播放音乐
            form2.ShowDialog()
            '继续下面的程序代码
        End Sub

        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            form2.Close()
        End Sub
    End Class
    在这段代码用我利用一个模态对话框来限制当前程序往下执行,form2是一个没有边界,大小为0的对话框窗体,当我用ShowDialog起来后它会将代码停留在那里,直到此对话框关闭后才会继续执行下面的代码。

    关闭此对话框我用了Timer控件,设置Timer控件的Interval = 5000表示是5秒,这样播放音乐不会受到影响。

    你可以测试一下我的代码,如果有任何问题,请告诉我。

    Sincerely,
    Kira Qian


    Please mark the replies as answers if they help and unmark if they don't.
    2009年5月6日 9:39

全部回复

  • winform 程序默认只有一个线程
    所以


          ****这里是调用某种方法播放某个音乐的代码,音乐长为5秒钟
             ****这里是暂停5秒钟的代码,但是不休眠,否则音乐也会停止。
              ****这里是下面的代码5秒钟后继续执行的。

    这三个部分放在一个new thread 是成立的   在form_load 是不成立的


    工作突然有点忙 嘿嘿
    2009年5月4日 8:22
  • 做一个空循环,判断执行时间大于5秒就结束
    http://feiyun0112.cnblogs.com/
    2009年5月4日 9:34
    版主
  • 你好~我上面是举个例子,如果我放在其他地方还是不行,还是做不到我要的效果。
    高手请指点

    2009年5月4日 9:52
  • 你好~我试过做死循环做监听,但是死循环的时候程序是无响应的
    多线程我试过一个方法就是下面一样,用等待线程结束的方法。
       Public asd As New System.Threading.Thread(AddressOf kkff)
       Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            asd.Start()
            asd.Join()
            MsgBox("线程结束了")
        End Sub

        Public Sub kkff()
            Threading.Thread.Sleep(5000)
        End Sub


    但是那个 Threading.Thread.Sleep(1000)停止的还是那个主线程,而不是我新建的那个asd线程,真是奇怪了。

    2009年5月4日 9:56
  • 你好!
         Thread.Sleep方法是将当前线程阻塞指定的毫秒数。
    周雪峰
    2009年5月4日 10:41
    版主
  • 那请教我应该怎么写呢?才能达到我需要的效果呢。
    2009年5月4日 11:07
  • 实现方式尽量更改为异步吧,虽然麻烦些但是比较灵活
    ***** 向着两颗奖牌出发!~~~ ^_^ *****
    ***** 本人目前处于努力学习模式,希望大家多多伸手帮助~ *****
    ***** 欢迎加我MSN~ kaedei@live.cn 希望各路高手耐心指导~ *****
    2009年5月4日 15:48
  • 你可以使用 BackgroundWorker 控件,
    1 定义 BackgroundWorker.DoWorker 事件,在事件中添加 Thread.Sleep(5000) ;定义BackgroundWorker.WorkerComplate 事件在事件中写你 5秒后要执行的代码。
    2 播放音乐
    3 BackgroundWorker.RunAsync();

    知识改变命运,奋斗成就人生!
    2009年5月5日 16:09
    版主
  • Hi 小小程序,

    我还有另外一个技巧也许对你有帮助,请看下面的代码:
    Public Class Form1
        Private form2 As Form = New Form()

        Public Sub New()
            InitializeComponent()
            Timer1.Interval = 5000
            Timer1.Enabled = True
            form2.Visible = False
            form2.Size = New Size(0, 0)
            form2.FormBorderStyle = Windows.Forms.FormBorderStyle.None
            form2.ShowInTaskbar = False
        End Sub

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            '播放音乐
            form2.ShowDialog()
            '继续下面的程序代码
        End Sub

        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            form2.Close()
        End Sub
    End Class
    在这段代码用我利用一个模态对话框来限制当前程序往下执行,form2是一个没有边界,大小为0的对话框窗体,当我用ShowDialog起来后它会将代码停留在那里,直到此对话框关闭后才会继续执行下面的代码。

    关闭此对话框我用了Timer控件,设置Timer控件的Interval = 5000表示是5秒,这样播放音乐不会受到影响。

    你可以测试一下我的代码,如果有任何问题,请告诉我。

    Sincerely,
    Kira Qian


    Please mark the replies as answers if they help and unmark if they don't.
    2009年5月6日 9:39
  • 十分感谢~这个方法可行~谢谢啦~
    2009年5月7日 14:53