我想创建一个音乐播放器,但我正在使用机器人。
我的机器人应该播放一系列动作(演讲,移动等),我需要能够随时停止它(为了安全起见)。
我正在使用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
相关联的 STOP 按钮:
void set_stop_to_true()
{
g_stop_ = true;
}
当我点击 PLAY 时,GUI冻结,我无法点击 STOP 。
如何让我的播放列表运行并能够点击GUI?(即GUI应该响应)
我最大的希望是一个线索,但我不确定如何正确使用它。
答案 0 :(得分:1)
当我点击 PLAY 时,GUI冻结,我无法点击 STOP 。
您需要构建多线程应用程序。您的界面因为您的应用程序忙于执行其他操作而冻结,因此不仅从GUI引发的事件未被处理,而且甚至不会引发它们。
您的应用程序应该启动一个将在后台完成工作的工作线程,然后主线程可以与此工作线程通信,例如通过共享内存。
答案 1 :(得分:0)
一旦你输入了像play_playlist
这样的回调,GTK主循环就无法处理事件,直到你退出该功能,这会冻结用户界面。由于play_action
需要几秒钟才能运行,因此您只有两个选择:
g_idle_add
触发的回调。这是一个例子
lazy loading的技术。play_action
。看看GThread。按PLAY时启动线程,按STOP键时停止播放。但是,您无法从一个线程操纵用户界面,GTK不是线程安全的。应该从主线程处理每个GTK操作。