使用2个以上线程进行Visual Basic线程

时间:2018-05-29 12:56:14

标签: vb.net multithreading

我目前正在尝试使用自定义beep类生成声音。蜂鸣声类的一种方法是产生具有给定频率的声音的多个八度音阶,因此一个声音是频率,另一个是频率* 2,另一个是频率* 4等。

我试图通过给每个声音提供自己的线程来使用线程来使这些声音一起发出声音。但是,我注意到它仍然一次播放一次声音。我可以确认这些声音并没有打断程序本身的流程,因此线程正在以这种身份运行。

这是我正在使用的代码。我们的想法是,对于 NumOctave 次,基于第一个(和幅度)生成新频率,并将其设置为在其自己的线程中发声。但是,似乎线程正在排队,而不是真正地彼此异步执行。什么是获得预期行为的最佳方式?

Shared Sub OctBeep(ByVal Amplitude As Integer,
         ByVal Frequency As Integer, ByVal NumOctaves As Integer,
         ByVal Duration As Integer, ByVal NewThread As Boolean)

    Dim threads As List(Of Thread) = New List(Of Thread)
    Dim powTwo As Integer = 1
    Dim powTen As Integer = 1
    For oct As Integer = 1 To NumOctaves
        Dim thisOct As Integer = oct

        Dim thisThread As New Thread(
              Sub()
                  Dim newFreq, newAmp As Integer
                  newFreq = Frequency * powTwo
                  newAmp = Amplitude / powTen
                  BeepHelp(newAmp, newFreq, Duration)
              End Sub
            )

        thisThread.IsBackground = True
        thisThread.Start()

        powTwo *= 2
        powTen *= 10
    Next

End Sub

这是BeepHelp()

Shared Sub BeepHelp(ByVal Amplitude As Integer,
         ByVal Frequency As Integer,
         ByVal Duration As Integer)

    Dim A As Double = ((Amplitude * 2 ^ 15) / 1000) - 1
    Dim DeltaFT As Double = 2 * Math.PI * Frequency / 44100

    Dim Samples As Integer = 441 * Duration \ 10
    Dim Bytes As Integer = Samples * 4
    Dim Hdr() As Integer = {&H46464952, 36 + Bytes, &H45564157,
                            &H20746D66, 16, &H20001, 44100,
                             176400, &H100004, &H61746164, Bytes}
    Using MS As New MemoryStream(44 + Bytes)
        Using BW As New BinaryWriter(MS)
            For I As Integer = 0 To Hdr.Length - 1
                BW.Write(Hdr(I))
            Next
            For T As Integer = 0 To Samples - 1
                Dim Sample As Short = CShort(A * Math.Sin(DeltaFT * T))
                BW.Write(Sample)
                BW.Write(Sample)
            Next
            BW.Flush()
            MS.Seek(0, SeekOrigin.Begin)
            Using SP As New SoundPlayer(MS)
                SP.PlaySync()
            End Using
        End Using
    End Using
End Sub

结束班

1 个答案:

答案 0 :(得分:0)

在编写语音合成器类之前,我遇到了同样的问题。多线程之间存在差异(只需移动到另一个线程,因此主程序仍可正常工作)&并行处理(将进程移动到自己的处理器)。您想要查看并行处理