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

问题描述 投票:0回答:2

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

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

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

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

c++ gtk
2个回答
1
投票

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

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

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


0
投票

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

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