Nano Hash - криптовалюты, майнинг, программирование

Запуск цикла while до тех пор, пока не будет получен конкретный ввод, но повторный запуск, если ничего не получено С++

Я пытаюсь запустить цикл while, пока на терминале не будет нажата клавиша ввода, но, насколько я могу судить, цикл останавливается на 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;
    }
03.12.2016

  • Это невозможно сделать в стандартном С++, вам нужен специфичный для платформы API. 03.12.2016
  • Евгений, это неправда. По крайней мере, у вас может быть отдельный поток, который читает данные блокирующим образом и использует переменную условия для уведомления рабочего потока. Но должен быть более простой способ. 03.12.2016

Ответы:


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 (обычный обработчик клавиши прерывания сигнала консоли), вы можете изменить приведенный выше код, чтобы он также игнорировал нажатие клавиши и просто обрабатывал тот факт, что пользователь запросил прерывание.

Надеюсь, что это может помочь.

03.12.2016
  • Безопасен ли сигнал std::cout <<? У меня есть сомнения. Мои программы слишком много раз застревали в тупике malloc, чтобы это выяснить, теперь я просто устанавливаю volatile std::sig_atomic_t и возвращаюсь. 04.12.2016
  • хороший улов @TheVee .. неопределенное поведение иногда работает так, как вы ожидаете, на некоторых платформах, но все еще не определено :) std::cout не столько безопасен для сигналов, он просто не определен для вызова любой стандартной библиотечной функции из установленного пользователем обработчика сигналов в способом, который я первоначально опубликовал. 04.12.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..