Java Swing ProgressBar在长时间的过程中不会更新

时间:2016-08-31 20:27:12

标签: java multithreading swing jprogressbar awt-eventqueue

我编写了一个程序,通过TCP套接字将数据块传输到设备。在写入每个块时,设备返回确认包。程序在收到每个确认后写入下一个块。该写/读序列不是基于时间/定时器的。当设备返回确认时,程序可以继续。

我想更新JProgressBar。该程序工作正常,但JProgressBar不会随着事情的进行而更新。通信过程不是基于计时器的,因此处理JProgressBar的基于计时器的线程对我来说不起作用,至少我现在的想法是这样。接近我需要的每个解决方案似乎都是基于计时器的。我不认为这些会起作用,我试图让它们发挥作用的尝试完全没有成功。

通过这个细分,我想我已经接近了:我试图制作' EventQueue'线程工作以支持JProgressBar,但到目前为止它还没有工作。我不是多线程应用程序的专家,所以请善待,请具体。我真的很难过。

int nFWIdx = 0;
final int NOFULLBLOCKS = (int)(arrFIRMWARE.length / BLOCK_INCREMENT);
jprgbarUpload.setMinimum(0);
jprgbarUpload.setMaximum(NOFULLBLOCKS + 1);

for (int blockno = 1; blockno <= NOFULLBLOCKS; blockno++) {
    StringBuilder sb = new StringBuilder();
    for (int loc = nFWIdx; loc < (nFWIdx + BLOCK_INCREMENT); loc++)
        sb.append(arrFIRMWARE[loc])
                .append(UtilityClass.TERMINATOR);
    nFWIdx += BLOCK_INCREMENT;
    byte[] bCOMMAND = sb.toString().getBytes(StandardCharsets.US_ASCII);

    outputstream.write(bCOMMAND);
    outputstream.flush();

    AtomicInteger aiBLOCKNO = new AtomicInteger(blockno);
    java.awt.EventQueue.invokeLater(() -> {
        jprgbarUpload.setValue(aiBLOCKNO.get());
    });

    boolean blnISACKRCVD = false;
    byte[] bINMESSAGE = new byte[TCP_SINGLE_FRAME_SIZE];
    while (!blnISACKRCVD) {
        int iSTREAMREAD = bufferedinputstream.read(bINMESSAGE);
        String sSTREAMREAD  = (new String (bINMESSAGE)).trim();
        if (sSTREAMREAD.length() == FIRMWARE_ACK_MESSAGE.length())
        {
            blnISACKRCVD = true;
        }
    }
}

0 个答案:

没有答案