我一整天都在修改这个代码,但是我又被卡住了…提前谢谢
基本上,这个程序是给我的问题和下面的代码片段,我认为是造成这个问题基本上,用户可以改变他们的“当前温度”,如果超过了上限或下限的阈值,就会调用一个“compareLimit”函数……然后这个函数调用各种其他函数(例如蜂鸣音,并允许在屏幕上打印一行传感器记录)但是,以下是我的问题(请记住,我必须使用哔哔声,但如果您有更好的方法,请建议):
哔哔声是一个痛苦的屁股,我的整个“警报”模式围绕哔哔声的持续时间这意味着每次我想按字母“O”打印报告时,它都会在发出哔哔声的同时突发奇想地打印出来如何消除此问题?
我想让用户仍然能够访问最后一个代码块(case语句),即使是在警报模式的“while循环”中,这样他们实际上可以通过按下R或F来改变报警模式来改变温度,并使系统恢复正常。

void updateDisplay()
{
clrscr();
    HANDLE hConsole; //standard c library call
hConsole = GetStdHandle(STD_OUTPUT_HANDLE); //used for output screen buffer to allow for coloured text

SetConsoleTextAttribute(hConsole, 2); //sets output screen colour for following text
printf("\nCurrent Temperature for channel 1 is %d\n\n", temperatureSensor1Reading);
printf("Upper Limit for channel 1 is  %d\n\n", getHighLimit(CH1));
printf("Lower Limit for channel 1 is  %d\n\n", getLowLimit(CH1));
setCurrentTemperature(CH1,temperatureSensor1Reading);

在这段代码中,我从同一个项目中的其他cpp源文件调用函数,开始将当前温度与设置的限制进行比较。
comparedLimits1 = compareLimit(CH1);
SetConsoleTextAttribute(hConsole, 14);

if (comparedLimits1 == TRUE) {
    printf("please press O to print out a temperature report for channel %i \n \n", selectChannel + 1);
    printf("please press P to silence the alarm for channel %i \n \n", selectChannel + 1);
}

while(comparedLimits1 == TRUE) {
    activateAlarm(CH1,temperatureSensor1Reading);
    comparedLogs1 = sensorLog();
    if (comparedLogs1 == TRUE) {
        printf("\n Channel %i has registered a temperature of %i \n \n ", selectChannel+1, temperatureSensor1Reading);
    }
}

这是我的函数,它将当前温度与设置的温度限值进行比较,并调用其他函数“哔”一声或允许用户打印一行“报告”。
temperature_t compareLimit (int channelID)
{
    temperature_t limitIsExceeded = FALSE;
    if ((temperatureChannel[channelID].currentTemperature > temperatureChannel[channelID].highLimit) | (temperatureChannel[channelID].currentTemperature < temperatureChannel[channelID].lowLimit))
    limitIsExceeded = TRUE;

    return limitIsExceeded;
}

void activateAlarm(int channelID, temperature_t temperature)
{
    int key = 0;

    if ((temperatureChannel[channelID].currentTemperature > temperatureChannel[channelID].highLimit) | (temperatureChannel[channelID].currentTemperature < temperatureChannel[channelID].lowLimit))
        callBeep();

    sensorLog();
if (_kbhit())
        key = _getch();

    if ((key == 'P') | (key == 'p')) {
        silenceBeep();
    }
}

void callBeep()
{
    Beep(250,2000);
}

void silenceBeep()
{
    Beep(0,2000);
}

temperature_t sensorLog()
{
    int key = 0;
    temperature_t notedLog = FALSE;
    if (_kbhit())
        key = _getch();

    if ((key == 'O') | (key == 'o')) {
        notedLog = TRUE;
        return notedLog;
    }
}

这是我仍然希望在用户处于“报警”模式时能够操作的代码为了让用户摆脱“报警”模式,他们必须能够降低当前的温度,这可以通过下面的case语句来实现
if( _kbhit()  ) {
    selectedCommand = _getch();

    switch(selectedCommand) {
        case 'R': //if user input is R
        case 'r'://if user input is r
            (*temperatureSensorReadings[selectChannel])++;
            break; //exits loop

        case 'F': //if user input is 'F'
        case 'f': //if user input is 'f'
            (*temperatureSensorReadings[selectChannel])--;
            break; //exits loop

最佳答案

使用Beep播放.wav文件,而不是使用PlaySound标志立即返回并异步播放声音您甚至可以将其中一个系统声音与一个预定义值一起使用。

09-25 21:27