运行while循环,直到收到特定输入,但如果没有收到c ++则重新运行

Posted

技术标签:

【中文标题】运行while循环,直到收到特定输入,但如果没有收到c ++则重新运行【英文标题】:Running a while loop until specific input received, but rerunning if nothing received c++ 【发布时间】:2017-04-18 12:50:07 【问题描述】:

我正在尝试运行一个 while 循环,直到在终端上按下 enter,但据我所知,循环在 cin.get() 处停止,直到收到某些内容。有没有办法让终端的输入成为可选的并重新运行 while 循环? 这是代码中的循环,如果我取出 cin.get() 部分它运行良好,我就是无法停止它。

        while (true) 

        // In each iteration of our main loop, we run the Myo event loop for a set number of milliseconds.
        hub.run(1);

        // Extract first timestamp from Myo (string casted as a number)
        if (tstart == 0)
            stringstream myStream(collector.stampTime);
            myStream >> tstart;
        

        // Extracting samples from DataCollector
        std::array<float, 3> acceData = collector.acceSamples;
        std::array<float, 3> gyroData = collector.gyroSamples;
        std::array<float, 3> oriData = collector.oriSamples;
        std::array<int8_t, 8> emgData = collector.emgSamples;

        for (int i = 0; i < emgData.size(); i++)

            if (i < 3) 
                // Accelerometer samples
                acce[i] = acceData[i];
                pAcce[i] = acce[i];

                // Gyroscope samples
                gyro[i] = gyroData[i];
                pGyro[i] = gyro[i];

                // Orientation samples
                ori[i] = oriData[i];
                pOri[i] = ori[i];
            

            // EMG samples
            emg[i] = emgData[i];
            pEMG[i] = emg[i];
        

        /*
        * Plot the result
        */
        engPutVariable(ep, "Acce", Acce);
        engPutVariable(ep, "Gyro", Gyro);
        engPutVariable(ep, "Ori", Ori);
        engPutVariable(ep, "EMG", EMG);
        engEvalString(ep,"EMG_gather");

        // Extract timestamps from Myo (string casted as a number) and compute elapsed time
        stringstream myStream(collector.stampTime);
        myStream >> tend;
        elapsedTime = (tend - tstart)/1000000;

        // Keep track of how many runs Myo has performed
        x++;
        if (x % 30 == 0)
            std::cout << x << endl;
        


        if (cin.get() == '\n')
            break;
        else if (cin.get() == '')
            continue;
    

【问题讨论】:

这不能在标准 c++ 中完成,您需要特定于平台的 API。 尤金,这不是真的。至少您可以有单独的线程以阻塞方式读取数据并使用条件变量通知工作线程。但应该有更简单的方法。 【参考方案1】:

这取决于您希望输入的复杂程度,但根据您发布的内容,您也可以 像这样使用std::signal 函数:

#include <iostream>
#include <csignal>

namespace 
    volatile std::sig_atomic_t m_stop;


static void app_msg_pump(int sig)

    if (sig == SIGINT || sig == SIGTERM) 
        m_stop = sig;
    


int main(int argc, char* argv[])

    m_stop = 0;
    std::signal(SIGINT, &app_msg_pump);  // catch signal interrupt request
    std::signal(SIGTERM, &app_msg_pump); // catch signal terminate request
    while (m_stop == 0) 
        // your loop code here
    
    std::cout << "Stopping.." << std::endl;
    // your clean up code here
    return 0;

这将一直运行,直到用户按下CTRL+C(通常的控制台信号中断键处理程序),您可以修改上面的代码以忽略按键,只处理用户请求中断的事实。

希望能有所帮助。

【讨论】:

std::cout &lt;&lt; 信号安全吗?我有我的怀疑。我的程序多次陷入malloc 死锁而无法找出,现在我只需设置volatile std::sig_atomic_t 并返回。 good catch @TheVee .. 未定义的行为有时会在某些平台上按照您期望的方式工作,但仍然未定义:) std::cout 并不是那么“信号安全”,它只是未定义为以我最初发布的方式从用户安装的信号处理程序调用任何标准库函数。

以上是关于运行while循环,直到收到特定输入,但如果没有收到c ++则重新运行的主要内容,如果未能解决你的问题,请参考以下文章

Endles循环(while循环)运行,直到我按下一个键。编程C

虽然没有收到信号?

While 循环用户输入

直到使用 while 循环输入有效的循环。我需要一段时间,但在哪里?

C ++,cin,直到不再使用while循环在线输入

邮递员 - 如何循环请求直到我得到特定的响应?