哔声命令正在破坏我的功能

Posted

技术标签:

【中文标题】哔声命令正在破坏我的功能【英文标题】:Beep command is ruining my function 【发布时间】:2013-03-25 01:34:28 【问题描述】:

我整天都在摆弄这段代码,但我又卡住了……提前谢谢

基本上这个程序给我带来了问题,下面是我认为导致问题的代码的 sn-ps。基本上,用户可以更改他们的“当前温度”,如果它超过上限或下限的阈值,则会调用“compareLimit”函数......然后此函数会调用各种其他函数(例如哔哔声,并允许一条线传感器记录打印在屏幕上)。但是以下是我的问题(请记住,我必须使用哔哔声,但如果您有更好的方法请告知):

哔哔声让人头疼,我的整个“警报”模式都围绕哔哔声的持续时间展开。这意味着每次我想按字母“O”来打印报告时,它都会随着哔哔声的结束而随心所欲地打印。如何消除这种情况?

我想让用户即使在警报模式的“while循环”中仍然能够访问最后一个代码块(case语句),以便他们可以通过按 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;
    

这是我仍然希望在用户处于“警报”模式时能够操作的一段代码。为了让用户摆脱“警报”模式,他们必须能够降低当前温度,这可以通过以下案例语句完成

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

【问题讨论】:

文字的圣墙。您能否将其分解为一个或多个简洁、可回答的问题? 嘿乔纳森....我实际上花了 20 分钟来考虑如何详细说明这个...如果我没有收到任何人的回复,我将重新编辑帖子....抱歉给您添麻烦 Beep 功能从何而来?可能是阻塞调用。 第三段代码,在activateAlarm函数中,在那里调用,然后转到另一个函数实际执行哔声和哔声持续时间 听起来一般你应该看看Multithreading in C and Win32。 【参考方案1】:

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

【讨论】:

以上是关于哔声命令正在破坏我的功能的主要内容,如果未能解决你的问题,请参考以下文章

法语语言环境正在破坏按钮功能

断言正在破坏 Mocha 测试中的异步功能

在 WooCommerce 中检查挂钩功能破坏网站上的用户角色

空的 services.json 文件正在破坏站点

Firebase 工具破坏了我的 webapp 依赖项

为啥 withRouter 与 connect() 一起使用会破坏我的反应应用程序?