【问题标题】:While-loop issuesWhile循环问题
【发布时间】:2009-05-26 06:15:11
【问题描述】:

我正在从 while 循环内的串行端口读取数据,如下所示:

while((len = this.getIn().read(buffer)) > 0) {
    data = new String(buffer, 0, len);
    System.out.println("data len " + len);
    handleModemresponse(data);
}

但是,当从流中读取数据开始时,有一个断开按钮的主 AWT 窗口没有得到任何监听器(整个窗口没有得到监听器)。它仅在传输完成时(即在 while 循环之外)进行侦听。

我希望我的 AWT 窗口在 while 循环中也能监听我的操作。

有什么想法可以实现这一点吗?

【问题讨论】:

    标签: java core


    【解决方案1】:

    为读取操作创建一个新线程。

    public class LongProcess implements Runnable {
      public void startProcess() {
        Thread t = new Thread(this);
        t.start();
      }
    
          public void run() {
    // Define inputstream here
            while((len = inputStream.read(buffer)) > 0) {
             data = new String(buffer, 0, len);
             System.out.println("data len " + len);
             handleModemresponse(data);
            }
          }
        }
    

    编辑(评论后 Tom Hawtin - tackline):

    SwingUtilities.invokeLater(new LongProcess ());
    

    【讨论】:

    • java.awt.EventQueue.invokeLater 回到 AWT EDT 线程。
    • er...invokeLater 用于在线程结束时通知 gui:最后在 run() 中执行类似的操作。 ...ies.invokeLater(new Runnable() { ...public void run() { gui.taskIsDone(result); ....
    【解决方案2】:

    看起来您在一个线程中拥有所有内容 - 因此,当您的工作方法正在进行时,您的 GUI 似乎被阻塞并且在循环结束之前不会响应任何操作。

    您必须将您的 GUI 出勤率放在一个线程中,将您的工作方法放在另一个线程中。

    【讨论】:

      【解决方案3】:

      您正在调用的读取方法正在阻塞。您需要将它移到不同的线程中才能让您的听众继续工作。

      【讨论】:

      • 更准确地说,阻塞 I/O 不是这里的问题。造成麻烦的是 GUI 线程上长期运行的进程。
      【解决方案4】:

      我怀疑您应该将此 while 循环推送到单独的线程中,以免在传输过程中占用您的 AWT 线程。

      【讨论】:

      • @Pax:很抱歉格式化删除了您的格式;)您在改写这个问题方面做得更好。
      • 没有问题,@VonC,这种情况经常发生,主要是因为一旦我开始编辑,我就会坚持让问题看起来不错,而且我花了太长时间。
      猜你喜欢
      • 2011-06-19
      • 2011-03-04
      • 1970-01-01
      • 2018-11-05
      • 2013-12-10
      • 2014-05-22
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多