如何在满足特定条件后立即退出函数(无需每行检查)?

问题描述 投票:0回答:1

我正在开发一个多线程应用程序。其中一个线程专用于处理警报系统,该系统根据警报情况播放某种警报(特定音调的序列)。还有一个选项可以通过从另一个线程升起标志来使警报静音。每当警报静音时,我希望我的程序立即停止警报,而不是执行所有序列。下面是我的代码结构的玩具示例:

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。

c multithreading return exit threadx
1个回答
0
投票

“如何做到这一点”的草图:

#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;
}
© www.soinside.com 2019 - 2024. All rights reserved.