feat(serial): 优化CH934x串口写入性能并修复多认证并发冲突
- 引入独立写执行器池确保同端口有序不同端口可并发 - 将同步写操作改为异步执行避免UI线程阻塞 - 实现认证UI协调器防止身份验证与告警覆盖层冲突 - 添加嵌套单用户认证状态快照管理机制 - 修复双人验证中用户身份一致性检查逻辑 - 优化抽屉信息轮询批量请求提升响应效率 - 修复管理账户权限组关联关系初始化问题 - 调整轮询间隔参数提高系统响应性
This commit is contained in:
@@ -21,6 +21,8 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import cn.wch.ch934xlib.CH934XManager;
|
||||
@@ -84,6 +86,22 @@ public class Ch934xSerialPlugin implements FlutterPlugin, MethodCallHandler, Act
|
||||
/** Modem 状态位缓存(CTS/DSR/RI/DCD)。SDK 仅以回调方式推送,这里聚合最近一次。 */
|
||||
private int modemStatusCache = 0;
|
||||
|
||||
/** 每个串口独立的单线程写执行器:同端口有序,不同端口可并发。 */
|
||||
private final ExecutorService[] writeExecutors = createWriteExecutors();
|
||||
|
||||
private static ExecutorService[] createWriteExecutors() {
|
||||
ExecutorService[] executors = new ExecutorService[8];
|
||||
for (int i = 0; i < executors.length; i++) {
|
||||
final int port = i;
|
||||
executors[i] = Executors.newSingleThreadExecutor(runnable -> {
|
||||
Thread thread = new Thread(runnable, "ch934x-write-" + port);
|
||||
thread.setDaemon(true);
|
||||
return thread;
|
||||
});
|
||||
}
|
||||
return executors;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
|
||||
applicationContext = binding.getApplicationContext();
|
||||
@@ -153,6 +171,9 @@ public class Ch934xSerialPlugin implements FlutterPlugin, MethodCallHandler, Act
|
||||
activeSerialNumber = -1;
|
||||
modemCallbackRegistered = false;
|
||||
exceptionCallbackEnabled = false;
|
||||
for (ExecutorService executor : writeExecutors) {
|
||||
executor.shutdownNow();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -211,7 +232,7 @@ public class Ch934xSerialPlugin implements FlutterPlugin, MethodCallHandler, Act
|
||||
result.success(handleRead(call));
|
||||
break;
|
||||
case "write":
|
||||
result.success(handleWrite(call));
|
||||
handleWriteAsync(call, result);
|
||||
break;
|
||||
case "setGpioOutput":
|
||||
result.success(handleSetGpioOutput(call));
|
||||
@@ -575,26 +596,35 @@ public class Ch934xSerialPlugin implements FlutterPlugin, MethodCallHandler, Act
|
||||
}
|
||||
}
|
||||
|
||||
/** 文档 6.2.1。 */
|
||||
private int handleWrite(@NonNull MethodCall call) throws UartLibException {
|
||||
/** 文档 6.2.1。阻塞 SDK 写入在对应串口的专用线程执行。 */
|
||||
private void handleWriteAsync(@NonNull MethodCall call, @NonNull Result result) {
|
||||
if (activeDevice == null) {
|
||||
return 0;
|
||||
result.success(0);
|
||||
return;
|
||||
}
|
||||
byte[] data = call.argument("data");
|
||||
if (data == null || data.length == 0) {
|
||||
return 0;
|
||||
result.success(0);
|
||||
return;
|
||||
}
|
||||
Integer portIndex = call.argument("serialPortIndex");
|
||||
int idx = portIndex != null ? portIndex : activeSerialNumber;
|
||||
if (idx < 0) {
|
||||
return 0;
|
||||
if (idx < 0 || idx >= writeExecutors.length) {
|
||||
result.success(0);
|
||||
return;
|
||||
}
|
||||
final UsbDevice device = activeDevice;
|
||||
writeExecutors[idx].execute(() -> {
|
||||
int written = 0;
|
||||
try {
|
||||
return CH934XManager.getInstance().writeData(
|
||||
activeDevice, idx, data, data.length, 2000);
|
||||
} catch (ChipException e) {
|
||||
return 0;
|
||||
written = CH934XManager.getInstance().writeData(
|
||||
device, idx, data, data.length, 2000);
|
||||
} catch (Throwable ignored) {
|
||||
// 与原同步实现一致:写失败返回 0,由 Dart 层处理。
|
||||
}
|
||||
final int completed = written;
|
||||
new Handler(Looper.getMainLooper()).post(() -> result.success(completed));
|
||||
});
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user