Isolate 정리
This commit is contained in:
parent
85152b0930
commit
cc0433b256
6 changed files with 150 additions and 75 deletions
|
|
@ -3,41 +3,46 @@ import 'package:dart_framework/subtitle/parser_smi.dart';
|
|||
import 'package:dart_framework/subtitle/parser_srt.dart';
|
||||
import 'package:path/path.dart' as path;
|
||||
|
||||
import 'package:dart_framework/platform/isolate_manager.dart' as isolate;
|
||||
import 'package:dart_framework/core/application.dart';
|
||||
import 'package:dart_framework/charset.dart';
|
||||
|
||||
void main() async {
|
||||
Application(() async {
|
||||
var filePath = Platform.script.toFilePath(windows: true);
|
||||
var file = File('${path.dirname(path.dirname(filePath))}/test_utf16le.smi');
|
||||
var bytes = file.readAsBytesSync();
|
||||
var encoding = Charset.detect(bytes);
|
||||
print(encoding);
|
||||
var result = encoding!.decode(bytes);
|
||||
|
||||
var ext = path.extension(file.path).toLowerCase();
|
||||
if (ext == '.smi') {
|
||||
//SMI
|
||||
var parser = ParserSMI();
|
||||
var subtitles = parser.getSubtitlesData(result);
|
||||
var index = 0;
|
||||
for (var item in subtitles.subtitles) {
|
||||
print('$index. ${item.text}');
|
||||
index++;
|
||||
}
|
||||
} else if (ext == '.srt') {
|
||||
//SRT
|
||||
var parser = ParserSRT();
|
||||
var subtitles = parser.getSubtitlesData(result);
|
||||
var index = 0;
|
||||
for (var item in subtitles.subtitles) {
|
||||
print('$index. ${item.text}');
|
||||
index++;
|
||||
}
|
||||
}
|
||||
isolate.test();
|
||||
}, (error, stack) {
|
||||
print(error);
|
||||
print(stack);
|
||||
exit(0);
|
||||
});
|
||||
}
|
||||
|
||||
void testParse() {
|
||||
var filePath = Platform.script.toFilePath(windows: true);
|
||||
var file = File('${path.dirname(path.dirname(filePath))}/test_utf16le.smi');
|
||||
var bytes = file.readAsBytesSync();
|
||||
var encoding = Charset.detect(bytes);
|
||||
print(encoding);
|
||||
var result = encoding!.decode(bytes);
|
||||
|
||||
var ext = path.extension(file.path).toLowerCase();
|
||||
if (ext == '.smi') {
|
||||
//SMI
|
||||
var parser = ParserSMI();
|
||||
var subtitles = parser.getSubtitlesData(result);
|
||||
var index = 0;
|
||||
for (var item in subtitles.subtitles) {
|
||||
print('$index. ${item.text}');
|
||||
index++;
|
||||
}
|
||||
} else if (ext == '.srt') {
|
||||
//SRT
|
||||
var parser = ParserSRT();
|
||||
var subtitles = parser.getSubtitlesData(result);
|
||||
var index = 0;
|
||||
for (var item in subtitles.subtitles) {
|
||||
print('$index. ${item.text}');
|
||||
index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,6 @@ enum IsolateEvent { ready, exit }
|
|||
|
||||
class IsoMessege {
|
||||
late String type;
|
||||
late Object? message;
|
||||
IsoMessege(this.type, {this.message});
|
||||
late Object? data;
|
||||
IsoMessege(this.type, {this.data});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -109,17 +109,18 @@ class Log {
|
|||
}
|
||||
}
|
||||
if (path != null && path!.isNotEmpty) {
|
||||
_writer.start(path!, _onWriterEvent);
|
||||
_writer
|
||||
.start(path!, {'request': _onReadyMessage, 'ready': _onReadyMessage});
|
||||
}
|
||||
}
|
||||
|
||||
void _onWriterEvent(IsoMessege message) {
|
||||
if (message.type == 'request') {
|
||||
write();
|
||||
} else if (message.type == 'ready') {
|
||||
path = message.message as String;
|
||||
appendString('Log path: ${message.message}');
|
||||
}
|
||||
void _onRequestMessage(Object? data) {
|
||||
write();
|
||||
}
|
||||
|
||||
void _onReadyMessage(Object? data) {
|
||||
path = data as String;
|
||||
appendString('Log path: $data');
|
||||
}
|
||||
|
||||
void write() {
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ class LogWriterIO extends IsolateBase implements LogWriter {
|
|||
'${dir.path}/log_${getDates().replaceAll(' ', '_').replaceAll(':', '-')}.txt'));
|
||||
await _file.create();
|
||||
print('[LogWriterIO] onReady - path: ${_file.path}');
|
||||
send(IsoMessege('ready', message: _file.path));
|
||||
send(IsoMessege('ready', data: _file.path));
|
||||
addEventListener('write', onWrite);
|
||||
requester();
|
||||
}
|
||||
|
|
@ -39,17 +39,18 @@ class LogWriterIO extends IsolateBase implements LogWriter {
|
|||
}
|
||||
|
||||
@override
|
||||
void start(String path, Function(IsoMessege) isoMessageListener) {
|
||||
IsolateManager.create<LogWriterIO>(LogWriterIO(), path, (event, data) {
|
||||
if (event == IsolateEvent.ready) {
|
||||
_id = data as int;
|
||||
}
|
||||
}, isoMessageListener);
|
||||
void start(
|
||||
String path, Map<String, void Function(Object?)> messageListenerMap) {
|
||||
var handler = IsolateManager.create<LogWriterIO>(LogWriterIO(), path);
|
||||
handler.addEventListener(IsolateEvent.ready, (data) => _id = data as int);
|
||||
for (var element in messageListenerMap.entries) {
|
||||
handler.addListener(element.key, element.value);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void write(String log) {
|
||||
IsolateManager.send(_id, IsoMessege('write', message: log));
|
||||
IsolateManager.send(_id, IsoMessege('write', data: log));
|
||||
}
|
||||
|
||||
@override
|
||||
|
|
|
|||
|
|
@ -8,29 +8,26 @@ import 'package:dart_framework/platform/process.dart';
|
|||
/// ********************** Test ************************* ///
|
||||
void test() {
|
||||
var initData = {"param0": "value0"};
|
||||
var id = IsolateManager.create<IsolateTemplate>(IsolateTemplate(), initData,
|
||||
(isoEvent, data) async {
|
||||
print('[Manager] OnInnerEvent - type: ${isoEvent.name}');
|
||||
if (isoEvent == IsolateEvent.ready) {
|
||||
int id = data as int;
|
||||
IsolateManager.sendBroadcast(IsoMessege('test1', message: 'initData1'));
|
||||
var handler =
|
||||
IsolateManager.create<IsolateTemplate>(IsolateTemplate(), initData);
|
||||
|
||||
await Future.delayed(Duration(seconds: 2));
|
||||
handler.addEventListener(IsolateEvent.ready, (data) async {
|
||||
handler.broadcast('test1', 'initData1');
|
||||
|
||||
IsolateManager.send(id, IsoMessege('test2', message: 'data2'));
|
||||
//will not arrive, addListener once
|
||||
IsolateManager.send(id, IsoMessege('test1', message: 'data1'));
|
||||
await Future.delayed(Duration(seconds: 2));
|
||||
|
||||
await Future.delayed(Duration(seconds: 5));
|
||||
handler.send('test2', message: 'data2');
|
||||
//will not arrive, addListener once
|
||||
handler.send('test1', message: 'data1');
|
||||
|
||||
IsolateManager.exit(id);
|
||||
} else if (isoEvent == IsolateEvent.exit) {
|
||||
print('[Manager] Isolate is exited.');
|
||||
}
|
||||
}, (message) {
|
||||
//Custom message
|
||||
print(
|
||||
'[Manager] OnMessage - type: ${message.type}, message: ${message.message}');
|
||||
await Future.delayed(Duration(seconds: 5));
|
||||
|
||||
handler.exit();
|
||||
});
|
||||
handler.addEventListener(
|
||||
IsolateEvent.exit, (data) => print('[Handler] Isolate is exited.'));
|
||||
handler.addListener("CutomMessage", (data) {
|
||||
print('[Handler] OnMessage - data: $data');
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -51,7 +48,7 @@ class IsolateTemplate extends IsolateBase {
|
|||
|
||||
Future delayTest() async {
|
||||
await Future.delayed(Duration(seconds: 5));
|
||||
send(IsoMessege('delayedCutomMessage', message: 'This is message'));
|
||||
send(IsoMessege('CutomMessage', data: 'This is message'));
|
||||
}
|
||||
|
||||
void onTest2Handler(Object? data) {
|
||||
|
|
@ -72,6 +69,73 @@ class _IsolateConstructData {
|
|||
_IsolateConstructData(this.id, this.mainIsoSender, this.initData);
|
||||
}
|
||||
|
||||
class IsolateHandler {
|
||||
final int _id;
|
||||
final Map<String, List<void Function(Object?)>> _listenerMap = {};
|
||||
final Map<IsolateEvent, List<void Function(Object?)>> _listenerEventMap = {};
|
||||
IsolateHandler(this._id);
|
||||
|
||||
void send(String type, {Object? message}) {
|
||||
IsolateManager.send(_id, IsoMessege(type, data: message));
|
||||
}
|
||||
|
||||
void addListener(String type, void Function(Object?) func) {
|
||||
removeListener(type, func);
|
||||
if (!_listenerMap.containsKey(type)) {
|
||||
_listenerMap[type] = [];
|
||||
}
|
||||
_listenerMap[type]?.add(func);
|
||||
}
|
||||
|
||||
void removeListener(String type, void Function(Object? data) func) {
|
||||
if (_listenerMap.containsKey(type)) {
|
||||
_listenerMap[type]?.remove(func);
|
||||
}
|
||||
}
|
||||
|
||||
void addEventListener(IsolateEvent event, void Function(Object? data) func) {
|
||||
removeEventListener(event, func);
|
||||
if (!_listenerEventMap.containsKey(event)) {
|
||||
_listenerEventMap[event] = [];
|
||||
}
|
||||
_listenerEventMap[event]?.add(func);
|
||||
}
|
||||
|
||||
void removeEventListener(
|
||||
IsolateEvent event, void Function(Object? data) func) {
|
||||
if (_listenerEventMap.containsKey(event)) {
|
||||
_listenerEventMap[event]?.remove(func);
|
||||
}
|
||||
}
|
||||
|
||||
void broadcast(String type, Object? data) {
|
||||
IsolateManager.sendBroadcast(IsoMessege(type, data: data));
|
||||
}
|
||||
|
||||
void _isolateEventHandler(IsolateEvent event, Object? data) {
|
||||
if (_listenerEventMap.containsKey(event)) {
|
||||
var list = _listenerEventMap[event];
|
||||
for (var item in list!) {
|
||||
item(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void _isolateMessageHandler(IsoMessege message) {
|
||||
var type = message.type;
|
||||
if (_listenerMap.containsKey(type)) {
|
||||
var list = _listenerMap[type];
|
||||
for (var item in list!) {
|
||||
item(message.data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void exit() {
|
||||
IsolateManager.exit(_id);
|
||||
}
|
||||
}
|
||||
|
||||
class IsolateManager {
|
||||
IsolateManager._privateConstructor();
|
||||
static final IsolateManager _instance = IsolateManager._privateConstructor();
|
||||
|
|
@ -90,14 +154,18 @@ class IsolateManager {
|
|||
final Map<int, IsolateBase> _isoMap = {};
|
||||
final Map<int, Map<String, Function(Object?)>> _innerEventMap = {};
|
||||
|
||||
static void create<T extends IsolateBase>(
|
||||
static IsolateHandler create<T extends IsolateBase>(
|
||||
T inst,
|
||||
Object? initData,
|
||||
Object?
|
||||
initData /*,
|
||||
Function(IsolateEvent, Object?) isolateEventListener,
|
||||
Function(IsoMessege) messageListener) async {
|
||||
Function(IsoMessege) messageListener*/
|
||||
) {
|
||||
var id = nonce;
|
||||
instance._create<T>(
|
||||
inst, initData, id, isolateEventListener, messageListener);
|
||||
var handler = IsolateHandler(id);
|
||||
instance._create<T>(inst, initData, id, handler._isolateEventHandler,
|
||||
handler._isolateMessageHandler);
|
||||
return handler;
|
||||
}
|
||||
|
||||
void _create<T extends IsolateBase>(
|
||||
|
|
@ -141,7 +209,7 @@ class IsolateManager {
|
|||
if (_innerEventMap.containsKey(id) &&
|
||||
_innerEventMap[id]!.containsKey(message.type)) {
|
||||
isNotExist = false;
|
||||
_innerEventMap[id]![message.type]!(message.message);
|
||||
_innerEventMap[id]![message.type]!(message.data);
|
||||
}
|
||||
return isNotExist;
|
||||
}
|
||||
|
|
@ -187,8 +255,7 @@ class IsolateBase {
|
|||
id = initData.id;
|
||||
_mainIsoListener = ReceivePort();
|
||||
_mainIsoSender = initData.mainIsoSender;
|
||||
send(IsoMessege(_IsolateInnerEvent.ready,
|
||||
message: _mainIsoListener.sendPort));
|
||||
send(IsoMessege(_IsolateInnerEvent.ready, data: _mainIsoListener.sendPort));
|
||||
onReady(initData.initData);
|
||||
await for (IsoMessege message in _mainIsoListener) {
|
||||
if (message.type == _IsolateInnerEvent.exit) {
|
||||
|
|
@ -211,7 +278,7 @@ class IsolateBase {
|
|||
if (_eventMap.containsKey(message.type)) {
|
||||
var list = _eventMap[message.type]!;
|
||||
for (var item in list) {
|
||||
item.listener(message.message);
|
||||
item.listener(message.data);
|
||||
if (item.executeOnce) {
|
||||
_removeList.add(item);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,8 @@ import 'package:dart_framework/platform/platform_stub.dart'
|
|||
abstract class LogWriter {
|
||||
factory LogWriter() => getLogWriter();
|
||||
|
||||
void start(String path, Function(IsoMessege) isoMessageListener);
|
||||
void start(
|
||||
String path, Map<String, void Function(Object?)> messageListenerMap);
|
||||
void write(String log);
|
||||
void end();
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue