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