Почему системный вызов (killall) не работает в glfw, Mac, c ++? - PullRequest
0 голосов
/ 11 мая 2019

Я пытаюсь воспроизвести звук, сопровождающий окно glfw на Mac, в C ++. Мой текущий подход заключается в том, чтобы выполнить системный вызов (afplay) в отдельном потоке для воспроизведения звука и использовать «killall afplay» в основном потоке, чтобы остановить его при необходимости.

В настоящее время системный вызов killall блокирует основной поток, а окно glfw не отвечает. При нажатии ctrl + c появляется сообщение «Соответствующие процессы не найдены», и системный вызов killall возвращает 256. Этот ctrl + c завершает системный вызов. Когда снова нажимаем Ctrl + C, мы выходим из основного потока.

Аналогичный подход работает на Linux-машине.

Команды afplay и killall работают хорошо, если они выдаются непосредственно из терминала.

1, когда я вызываю stop_sound () в "position 0", он работает (первый двоичный файл воспроизводит звук, и звук прерывается при запуске второго двоичного файла), поэтому я думаю, что он как-то связан с glfw.

2, когда я вызываю stop_sound в "position 1", он все еще блокируется.

3, использование нового потока для остановки звука или даже отсоединение его не имеет значения

void play_sound(){
    system("afplay my_sound_file.wav");
}
void stop_sound(){
    system("killall afplay");
}
main(){ 

     //position 0 

     while (!glfwWindowShouldClose(window)) {
        if(gui.R_key_pressed() && !play_sound){
            std::thread audio(play_sound);
            audio.detach();
            play_sound = true;
        }

        if(gui.R_key_pressed() && play_sound){
            stop_sound();
            play_sound = false;
        }   
        glfwPollEvents();
    }
    glfwDestroyWindow(window);
    glfwTerminate();

    //position 1

    exit(EXIT_SUCCESS);
}
...