我正在开发一个多线程应用程序。其中一个线程专用于处理警报系统,该系统根据警报情况播放某种警报(特定音调的序列)。还有一个选项可以通过从另一个线程升起标志来使警报静音。每当警报静音时,我希望我的程序立即停止警报,而不是执行所有序列。下面是我的代码结构的玩具示例:
static int mute = 0;
static int current_alarm = 0;
void play_alarm_2 (void)
{
play_g_tone();
sleep(30);
play_a_tone();
sleep(20);
. . .
}
void play_alarm_1 (void)
{
play_c_tone();
sleep(10);
play_f_tone();
sleep(20);
. . .
}
void set_mute_status (int mute_status)
{
mute = mute_status;
}
void set_current_alarm (int alarm)
{
current_alarm = alarm;
}
int main()
{
for(;;)
{
switch(current_alarm)
case 1:
play_alarm_1();
case 2:
play_alarm_2();
. . .
}
}
其他线程设置报警情况和静音选项。现在举例来说,如果闹钟线程当前位于 play_alarm_2 内部并且正在播放 g_tone,如果用户突然将闹钟静音,我想退出函数 play_alarm_2 (g_tone 可以完成播放,不必将其缩短) )。一个愚蠢的方法是每隔一行添加一个:
void play_alarm_2 (void)
{
if (mute)
return
play_g_tone();
if (mute)
return
sleep(30);
if (mute)
return
play_a_tone();
if (mute)
return
sleep(20);
. . .
}
这看起来又有点愚蠢,但它解决了我的问题吗?我也可以为此设置一个宏。但我的问题是,有没有更合适的方法来做到这一点?可能有一个解决方案包括引入另一个线程,但如果可以的话我会避免它。如果确实没有其他线程就无法做到这一点,那么实现此目的的正确方法是什么?
P.S:此代码将在嵌入式系统上运行,我正在使用 ThreadX。
“如何做到这一点”的草图:
#define N 6 // 0-5 steps
for( int i = 0; ; i = (i+1) % N ) { // 0-1-2-3-4-5-0-1-2...
switch( i ) {
case 0: play_a_tone(); break;
case 2: play_g_tone(); break;
case 4: play_c_tone(); break;
case 1:
case 3:
sleep(30);
break;
case 5:
sleep(200);
break;
}
if( mute ) return;
}