diff --git a/lib/platform/isolate_manager.dart b/lib/platform/isolate_manager.dart index 41a2b9d..4b82709 100644 --- a/lib/platform/isolate_manager.dart +++ b/lib/platform/isolate_manager.dart @@ -1,26 +1,35 @@ +import 'dart:io'; import 'dart:isolate'; import 'dart:async'; import 'package:dart_framework/data/isolate_data.dart'; +import 'package:dart_framework/platform/process.dart'; /// ********************** Test ************************* /// void test() { var initData = {"param0": "value0"}; - IsolateManager.create(IsolateTemplate(), initData, + var id = IsolateManager.create(IsolateTemplate(), initData, (isoEvent, data) async { + print('[Manager] On Event from Isolate: ${isoEvent.name}'); if (isoEvent == IsolateEvent.ready) { int id = data as int; - IsolateManager.sendBroadcast(IsoMessege('test1')); + IsolateManager.sendBroadcast(IsoMessege('test1', message: 'initData1')); + await Future.delayed(Duration(seconds: 2)); - IsolateManager.send(id, IsoMessege('test2')); - IsolateManager.send(id, IsoMessege('test1')); + + IsolateManager.send(id, IsoMessege('test2', message: 'data2')); + //will not arrive, addListener once + IsolateManager.send(id, IsoMessege('test1', message: 'data1')); + + await Future.delayed(Duration(seconds: 7)); + IsolateManager.exit(id); } else if (isoEvent == IsolateEvent.exit) { - print('Isolate is exited.'); + print('[Manager] Isolate is exited.'); } - print('On Event from Isolate: ${isoEvent.name}'); }, (message) { - print('On Message from Isolate: ${message.type}'); + //Custom message + print('[Manager] On Message from Isolate: ${message.type}'); }); } @@ -32,8 +41,16 @@ class IsolateTemplate extends IsolateBase { addEventListener('test2', onTest2Handler); } - void onTest1Handler(Object? data) { + void onTest1Handler(Object? data) async { print('[IsolateTemplate] OnTest1Handler: $data'); + var path = Platform.isWindows ? '%path%' : '\$path'; + ProcessExecutor.run(StringBuffer('echo $path')); + await delayTest(); + } + + Future delayTest() async { + await Future.delayed(Duration(seconds: 5)); + send(IsoMessege('delayedCutomMessage', message: 'This is message')); } void onTest2Handler(Object? data) { @@ -57,10 +74,10 @@ class _IsolateConstructData { class IsolateManager { IsolateManager._privateConstructor(); static final IsolateManager _instance = IsolateManager._privateConstructor(); - static IsolateManager get to => _instance; + static IsolateManager get instance => _instance; - int _nonce = 0; - int get nonce { + static int _nonce = 0; + static int get nonce { if (_nonce == double.maxFinite.toInt()) { _nonce = 0; } else { @@ -77,16 +94,18 @@ class IsolateManager { Object? initData, Function(IsolateEvent, Object?) isolateEventListener, Function(IsoMessege) messageListener) async { - to._create(inst, initData, isolateEventListener, messageListener); + var id = nonce; + instance._create( + inst, initData, id, isolateEventListener, messageListener); } void _create( T inst, Object? initData, + int id, Function(IsolateEvent, Object?) isolateEventListener, Function(IsoMessege) messageListener) async { final isoListener = ReceivePort(); - var id = nonce; inst.id = id; _isoMap[id] = inst; _addInnerEvent(id, _IsolateInnerEvent.ready, (message) { @@ -127,21 +146,21 @@ class IsolateManager { } static void sendBroadcast(IsoMessege message) { - var entries = to._isoMap.entries; + var entries = instance._isoMap.entries; for (var entry in entries) { entry.value.insertEvent(message); } } static void send(int id, IsoMessege message) { - var map = to._isoMap; + var map = instance._isoMap; if (map.containsKey(id)) { map[id]?.insertEvent(message); } } static void exit(int id) { - var map = to._isoMap; + var map = instance._isoMap; if (map.containsKey(id)) { map[id]!.insertEvent(IsoMessege(_IsolateInnerEvent.exit)); }