用C ++ / GTK制作音乐播放器

时间:2013-10-04 15:18:43

标签: c++ gtk

我想创建一个音乐播放器,但我正在使用机器人。

我的机器人应该播放一系列动作(演讲,移动等),我需要能够随时停止它(为了安全起见)。

我正在使用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应该响应)

我最大的希望是一个线索,但我不确定如何正确使用它。

2 个答案:

答案 0 :(得分:1)

  

当我点击 PLAY 时,GUI冻结,我无法点击 STOP

您需要构建多线程应用程序。您的界面因为您的应用程序忙于执行其他操作而冻结,因此不仅从GUI引发的事件未被处理,而且甚至不会引发它们。

您的应用程序应该启动一个将在后台完成工作的工作线程,然后主线程可以与此工作线程通信,例如通过共享内存

答案 1 :(得分:0)

一旦你输入了像play_playlist这样的回调,GTK主循环就无法处理事件,直到你退出该功能,这会冻结用户界面。由于play_action需要几秒钟才能运行,因此您只有两个选择:

  1. 将play_playlist执行分成几个较小的步骤,并使用a 状态机使用a一个接一个地执行每个步骤 由g_idle_add触发的回调。这是一个例子 lazy loading的技术。
  2. 另一种解决方案是在一个线程中运行阻塞play_action。看看GThread。按PLAY时启动线程,按STOP键时停止播放。但是,您无法从一个线程操纵用户界面,GTK不是线程安全的。应该从主线程处理每个GTK操作。