Сделай плеер в cpp / gtk

мой первый пост на stackoverflow

Я хотел бы создать плеер (например, музыкальный плеер), но я работаю с роботами.
Мой робот должен сыграть серию действий (речь, движение, что угодно …)
Я должен быть в состоянии остановить это каждый раз (для безопасности)

Я работаю с C ++ и GTK

У меня есть кнопка «PLAY» для ссылки на функцию «play_playlist»

void play_playlist ()
{
std::deque<history_record>::iterator it = list_to_play_.begin ();
while (!g_stop_ && it != list_to_play_.end ())
{
play_action (it); //take time to execute (simulate using sleep 3sec)
it++;
}
}

И ссылка кнопки «СТОП» на функцию «set_stop_to_false»

void set_stop_to_true ()
{
g_stop_ = true;
}

Когда я запускаю «PLAY», графический интерфейс останавливается, и я не могу нажать «STOP».

Как я могу запустить свой плейлист и иметь возможность нажимать на GUI?

Моя лучшая надежда — это тема, но я не знаю, как ее использовать, чтобы делать то, что я хочу.

0

Решение

«Когда я запускаю« PLAY », графический интерфейс останавливается, и я не могу нажать« STOP »… Как я могу запустить свой плейлист и иметь возможность нажимать на GUI?»

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

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

1

Другие решения

Как только вы вводите обратный вызов, как play_playlistосновной цикл GTK не может обрабатывать события до тех пор, пока вы не выйдете из этой функции, что блокирует пользовательский интерфейс. Как play_action для запуска требуется несколько секунд, у вас есть только 2 варианта:

  1. разделите выполнение play_playlist на несколько меньших шагов и используйте
    конечный автомат, чтобы выполнить каждый шаг один за другим, используя
    обратный вызов, вызванный g_idle_add, Вот пример этого
    техника для ленивая загрузка.
  2. Другое решение состоит в том, чтобы запустить вашу блокировку play_action в потоке. Посмотрите на GThread. Вы запускаете поток, когда нажимаете PLAY, и останавливаете его, когда нажимаете STOP. Однако вы не можете манипулировать пользовательским интерфейсом из потока, GTK не является потокобезопасным. Каждое действие GTK должно обрабатываться из основного потока.
0

По вопросам рекламы [email protected]