我是C#的初学者,我有以下问题。我的想法是:我有一些可能的触发器[water_level_threshold1
,water_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
"因此,如果我在这种情况下重新进入,则会打开一个新线程,并且警报将再次播放
非常感谢任何详细的建议和/或解决方案
提前感谢那些试图提供帮助的人
答案 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;
}
}