0

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

我的机器人应该进行一系列动作(说话、移动等),并且我需要能够随时停止它(为了安全)。

我正在使用 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++;
    }
}

和一个STOP链接到该功能的按钮set_stop_to_false

void set_stop_to_true()
{
    g_stop_ = true;
}

当我单击PLAYGUI 冻结并且我无法单击STOP.

如何让我的播放列表运行并能够单击 GUI?(即 GUI 应该是响应式的)

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

4

2 回答 2

1

当我单击PLAYGUI 冻结并且我无法单击STOP.

您需要构建一个多线程应用程序。您的界面冻结,因为您的应用程序正忙于做其他事情,因此不仅从 GUI 引发的事件没有被处理,而且它们甚至没有被引发。

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

于 2013-10-04T15:35:21.487 回答
0

一旦你输入一个回调play_playlist,GTK 主循环就不能处理事件,直到你退出该函数,这会冻结用户界面。由于play_action需要几秒钟才能运行,您只有 2 个选择:

  1. 将 play_playlist 执行拆分为几个较小的步骤,并使用状态机使用由g_idle_add. 下面是这种延迟加载技术的示例。
  2. 另一种解决方案是在线程中运行阻塞play_action。看看GThread。按 PLAY 时开始线程,按 STOP 时停止线程。但是,您不能从线程操作用户界面,GTK 不是线程安全的。每个 GTK 动作都应该从主线程处理。
于 2013-10-05T22:56:25.523 回答