0

我编写了一个程序,通过 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;
        }
    }
}
4

0 回答 0