IsolateManager 리펙토링
This commit is contained in:
parent
2b6510f0a5
commit
96eb818499
1 changed files with 35 additions and 16 deletions
|
|
@ -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>(IsolateTemplate(), initData,
|
||||
var id = IsolateManager.create<IsolateTemplate>(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<T>(inst, initData, isolateEventListener, messageListener);
|
||||
var id = nonce;
|
||||
instance._create<T>(
|
||||
inst, initData, id, isolateEventListener, messageListener);
|
||||
}
|
||||
|
||||
void _create<T extends IsolateBase>(
|
||||
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));
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue