TCP ソケットを介してデータ ブロックをデバイスに送信するプログラムを作成しました。各ブロックが書き込まれるたびに、デバイスは確認パケットを返します。プログラムは、確認応答を受信するたびに次のブロックを書き込みます。この書き込み/読み取りシーケンスは、時間/タイマー ベースではありません。デバイスが肯定応答を返すと、プログラムは続行されます。
JProgressBar を更新したい。プログラムは正常に動作しますが、処理が進むにつれて JProgressBar が更新されません。通信プロセスはタイマー ベースではないため、JProgressBar を処理するためのタイマー ベースのスレッドは機能しません。少なくとも、今はそう考えています。私のニーズに近いソリューションはすべて、タイマーベースのようです。私はこれらが機能するとは思わず、それらを機能させるための私の実行可能な試みは完全に失敗しました.
このセグメントで、私は近いと思います: JProgressBar をサポートするために「EventQueue」スレッドを機能させようとしていますが、今のところ機能していません。私はマルチスレッド アプリケーションの専門家ではないので、具体的に教えてください。私は本当に困惑しています。
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;
}
}
}