мой первый пост на 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?
Моя лучшая надежда — это тема, но я не знаю, как ее использовать, чтобы делать то, что я хочу.
«Когда я запускаю« PLAY », графический интерфейс останавливается, и я не могу нажать« STOP »… Как я могу запустить свой плейлист и иметь возможность нажимать на GUI?»
Вам нужно построить многопоточное приложение. Ваш интерфейс зависает, потому что ваше приложение занято чем-то другим, поэтому не только события, вызванные из GUI, не обрабатываются, но даже не вызываются.
Ваше приложение должно запустить рабочий поток, который будет выполнять свою работу в фоновом режиме, после чего основной поток сможет взаимодействовать с этим рабочим потоком, например, через Общая память.
Как только вы вводите обратный вызов, как play_playlist
основной цикл GTK не может обрабатывать события до тех пор, пока вы не выйдете из этой функции, что блокирует пользовательский интерфейс. Как play_action
для запуска требуется несколько секунд, у вас есть только 2 варианта:
g_idle_add
, Вот пример этогоplay_action
в потоке. Посмотрите на GThread. Вы запускаете поток, когда нажимаете PLAY, и останавливаете его, когда нажимаете STOP. Однако вы не можете манипулировать пользовательским интерфейсом из потока, GTK не является потокобезопасным. Каждое действие GTK должно обрабатываться из основного потока.