线程无法正常工作

时间:2014-06-05 13:44:31

标签: c# multithreading

我有一个应用程序,重复我听到的数字,然后记录我读到的数字。数字为0,1,2,3,4,5,6,7,8,9。我使用for循环来播放这些数字,其中包含来自第三方的文本到语音技能。

对于录制部分,我必须按照第三方要求将其放在单独的线程中。要录制语音,方法很可能是:

 recordVoiceResource.Record(fileName);

要停止它,请使用:

 recordVoiceResource.Stop();

现在我发现有时我的录音是0秒,这意味着代码可能没有达到Record行。有时它只有2秒钟。我认为线程安排是错误的。

 private ManualResetEvent terminate = new ManualResetEvent(false);

 PlayTTS("Please repeat the following numbers as you hear them.");

                Thread t = new Thread(() => RecordNumbers());
                t.Start();
                Thread.Sleep(2000);
                terminate.Set();
                terminate.WaitOne();
                PlayNumbers();
                recordVoiceResource.Stop();

线程方法是:

    private void RecordNumbers()
    {
        recordVoiceResource = TelephonyServer.GetVoiceResource();
        recordVoiceResource.MaximumSilence = 1;
        recordVoiceResource.MaximumTime = 30;
        // Start recording what I read from I heard
        recordVoiceResource.Record(fileName);
    }

要玩游戏,

    private void PlayNumbers()
    {
        foreach (var item in numbers)
        {
            try
            {
                vr.PlayTTS(item.ToString()); // will be 0,1,2,...9
                Thread.Sleep(2000);
            }

2 个答案:

答案 0 :(得分:2)

根据您的评论,属性MaximumSilence获取或设置在下一个语音功能终止之前允许的最大静音(以秒为单位)。您将其设置为一秒钟,开始录制,然后在开始播放之前休眠两秒钟,提示用户说出某些内容。你看到这个问题吗?假设麦克风在此期间没有收到一些不相关的语音,录音将在播放开始前停止。

由于数字播放之间存在2秒的差距,您可能需要将MaximumSilence设置为几秒钟。

当然,这是假设您的意图是捕获用户说出所有数字的单个记录(这是您的代码的编写方式)。如果您想单独捕获口述号码,则可能需要在播放每个号码时安排和同步单独的录音。您可能需要仔细检查API以确保您的解决方案符合您的预期。

答案 1 :(得分:0)

由于Thread.Sleep(),很可能导致您的问题。改为使用计时器:

System.Timers.Timer Record = new System.Timers.Timer();
Record.Interval = 2000;
Record.Elapsed += new System.Timers.ElapsedEventHandler(Record_Elapsed);

            void Record_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
            {                   
                 Record.Enabled=false;                  
                 PlayNumbers();
                 recordVoiceResource.Stop();
            }

并设置:

Thread t = new Thread(() => RecordNumbers());
              t.Start();
              Record.Enabled=true;