C#如何根据外部条件处理带有线程的标志

时间:2015-08-17 00:49:07

标签: c# multithreading audio asynchronous

我是C#的初学者,我有以下问题。我的想法是:我有一些可能的触发器[water_level_threshold1water_level_threshold2]。如果water_level_threshold2处于活动状态water_level_threshold1为false [threshold1 = true表示水位介于两个值之间]。根据触发器,我想激活对应于两个警报的两个声音。每隔几毫秒监控一次条件,我的警报持续几秒钟。我需要异步播放声音,因为我不想停止水位监测。水位当然可以随机变化。目前,例如对于第一个阈值,我写了类似的东西:

if ((!water_level_threshold1_sound_already_started) && (water_level_threshold1))
{
    using (SoundPlayer player = new SoundPlayer(@"C:\Users\Antonino\Desktop\water_level_threshold1_alarm.wav"))
    {
        player.PlayLooping();
    }

    // to avoid the sound to be stuck on its first msecs [sampling time]
    water_level_threshold1_sound_already_started = true;
}

As far as I know SoundPlayer每次只能处理一个曲调,因此它们不会重叠。此外,循环确保我将按照我想要的那样播放曲调,直到处于该状态。但如果我有时间变化,如:

threshold1 exceeded [alarm1 performs correctly]->
threshold2 exceeded [alarm2 performs correctly]->
** water level decreased then **->
threshold1 exceeded [no audio]->
threshold2 exceeded [no audio]

从第二次出现他们将不再工作,因为他们被告知已经被启动,因为他们在不同的线程中执行我无法找到一种方法让一个线程说:"我完成了我的执行然后我可以把water_level_threshold1_sound_already_started = false"因此,如果我在这种情况下重新进入,则会打开一个新线程,并且警报将再次播放

非常感谢任何详细的建议和/或解决方案

提前感谢那些试图提供帮助的人

2 个答案:

答案 0 :(得分:0)

BackgroundWorker可以在这种情况下提供帮助。 在DoWork活动中,您将介绍您的操作,并通过检查IsBusy属性,您可以检查它运行与否的天气。 祝你好运。

答案 1 :(得分:0)

最后我解决了我的问题如下。希望它能有所帮助。我放player_already_used标志,看看是否有意义停止player。达到threshold级别后,我们开始PlayLooping()。由于我们有一个开始的停止 - 播放器部分,如果级别改变,我们将不会在更多的曲调之间存在重叠问题。水阈值变化拉高trigger s,这些根据测量的水位确定将播放哪种声音。我认为这个解决方案[当然这个特定问题]允许更容易处理线程,因为不需要添加一个或多个BackgroundWorker s

var waterThresholdOld = waterThreshold;
//GetAlert returns a string
waterThreshold = detection.GetAlert();

if ((waterThreshold != waterThresholdOld) && (player_already_used))
{
    player.Stop();
    water_level_threshold1_trigger_enabled = false;
    water_level_threshold2_enabled = false;
    water_level_threshold1_sound_already_started = false;
    water_level_threshold2_sound_already_started = false;
}

if (waterThreshold == ("water_level_threshold1" + Environment.NewLine) )
{
    water_level_threshold1_trigger_enabled = true;
    water_level_threshold2_trigger_enabled = false;

    if ((!water_level_threshold1_already_started) && (waterThreshold != waterThresholdOld))
    {
        player = new SoundPlayer(@"C:\Users\Antonino\Desktop\water_level_threshold1_alarm.wav");
        {
            player.PlayLooping();
            player_already_used = true;
        }

        // to avoid the sound to be stuck on its first msecs [sampling time]
        water_level_threshold1_sound_already_started = true;
    }
}