【问题标题】:Better way to implement empty while loop to hold control实现空while循环以保持控制的更好方法
【发布时间】:2014-04-17 17:05:15
【问题描述】:

我正在后台播放音频,我希望程序的控制保持静止,直到音频播放结束,因为我正在使用如下的空 while 循环

while(isPlaying==true){};
mediaPlayer.stop();

如您所见,while 循环保持程序控制,直到播放音频并执行下一条指令。这工作正常,但我开始知道这不是做这个空的正确方法 - 虽然很昂贵,但我正在寻找替代方案。请帮忙。

【问题讨论】:

  • 那么这是 Java、C 还是 C++...?
  • 我在java中实现..我认为循环解决方案是通用的..我将删除其他标签
  • 循环是,同步不是。

标签: java while-loop


【解决方案1】:

简单的方法是将sleep(1) 放入while 循环中。并且cpu使用不会占用更多。

【讨论】:

    【解决方案2】:

    您可以考虑sleep(time in milliseconds )。这将允许执行 while 循环的线程休眠指定的毫秒数,然后再次检查条件。

    while(isPlaying==true)
    {
      Thread.currentThread().sleep(1000); // sleep for 1 sec
    };
    

    这一次很快,但更好的方法是使用@JasonC 在他的回答中建议的一些wait()notify() 机制。

    【讨论】:

    • +1,但一个简单的等待/通知将在没有循环的情况下完成同样的事情(或由于较长的睡眠时间而导致的延迟)。
    • @JasonC 同意你的观点!!
    【解决方案3】:

    你真的不需要在空的while loop 中使用{}

    while(isPlaying); 就足够了。

    另外,正如其他人已经建议的那样,考虑在循环中使用延迟,即

    线程.sleep(100); // 在 Java 中休眠 1/10 秒

    或者

    延迟(100); // 在 Java 中休眠 1/10 秒

    【讨论】:

      【解决方案4】:

      假设您的程序是 Java 的(...为什么要给它三个语言标签?)您有几个选择。您可以使用适当的同步事件,例如:

      // fields
      Object playerStopEvent = new Object();
      boolean isPlaying;
      
      // in your media player, when playback is complete:
      synchronized (playerStopEvent) {
         isPlaying = false;
         playerStopEvent.notifyAll();
      } 
      
      // elsewhere, when waiting for playback to complete:
      synchronized (playerStopEvent) {
         while (isPlaying) {
             try {
                 playerStopEvent.wait();
             } catch (InterruptedException x) {
                 // abort or ignore, up to you
             }
          }
      }
      mediaPlayer.stop();
      

      更多示例请参见Guarded Blocks 上的官方教程。

      您也可以让mediaPlayer 在完成时调用一些回调,例如开始播放时禁用 GUI 组件,并在调用完成的回调时重新启用它们(您也可以在此处使用事件侦听器方法)。

      如果没有更多信息,我推荐后者,因为它不会阻止您在播放器播放时执行其他不相关的事情(或阻止您的程序完全响应),但前者可能更合适,具体取决于您的情况。

      如果它是在 C 或 C++ 中,则概念是相同的。对第一个选项使用任何等效的条件变量/事件,或者对第二个选项使用任何等效的回调/侦听器/信号+槽。

      【讨论】:

        【解决方案5】:

        第一件事是您不必比较您在代码中完成的 2 个布尔字段...

        while(isPlaying==true){};
        

        你可以这样做......

        while(isPlaying){};
        

        而且,既然你已经告诉你正在使用 java,你可以试试这个......

        while(isPlaying){
           Thread.sleep(1);
        };
        

        【讨论】:

        • @JasonC,我已经更改了我的代码,因为 OP 描述他正在使用 Java。
        【解决方案6】:

        好吧,以我的拙见,最好使用其他实现.. 尝试使用线程,这样它就不会把你的程序挂在那里(毕竟这是一个背景音频;你可能想在音频播放时做其他事情)..

        尝试检查this page out..

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-01-26
          • 1970-01-01
          • 1970-01-01
          • 2013-06-28
          • 1970-01-01
          • 2019-04-17
          • 2021-12-29
          • 1970-01-01
          相关资源
          最近更新 更多