From cc0433b2567e7dc537ea5e934b47637bc3c7dc74 Mon Sep 17 00:00:00 2001 From: "leedongmyung[desktop]" Date: Fri, 3 Nov 2023 19:49:21 +0900 Subject: [PATCH] =?UTF-8?q?Isolate=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/main.dart | 59 +++++++------- lib/data/isolate_data.dart | 4 +- lib/log/log.dart | 17 ++-- lib/log/log_writer_io.dart | 17 ++-- lib/platform/isolate_manager.dart | 125 +++++++++++++++++++++++------- lib/platform/platform_base.dart | 3 +- 6 files changed, 150 insertions(+), 75 deletions(-) diff --git a/bin/main.dart b/bin/main.dart index 1d0ffc8..97f8f35 100644 --- a/bin/main.dart +++ b/bin/main.dart @@ -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++; + } + } +} diff --git a/lib/data/isolate_data.dart b/lib/data/isolate_data.dart index 99d913c..107ee29 100644 --- a/lib/data/isolate_data.dart +++ b/lib/data/isolate_data.dart @@ -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}); } diff --git a/lib/log/log.dart b/lib/log/log.dart index 53abef1..45064f4 100644 --- a/lib/log/log.dart +++ b/lib/log/log.dart @@ -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() { diff --git a/lib/log/log_writer_io.dart b/lib/log/log_writer_io.dart index 51577ce..dc8e94f 100644 --- a/lib/log/log_writer_io.dart +++ b/lib/log/log_writer_io.dart @@ -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(), path, (event, data) { - if (event == IsolateEvent.ready) { - _id = data as int; - } - }, isoMessageListener); + void start( + String path, Map messageListenerMap) { + var handler = IsolateManager.create(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 diff --git a/lib/platform/isolate_manager.dart b/lib/platform/isolate_manager.dart index f42776c..64531d7 100644 --- a/lib/platform/isolate_manager.dart +++ b/lib/platform/isolate_manager.dart @@ -8,29 +8,26 @@ import 'package:dart_framework/platform/process.dart'; /// ********************** Test ************************* /// void test() { var initData = {"param0": "value0"}; - var id = IsolateManager.create(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(), 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> _listenerMap = {}; + final Map> _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 _isoMap = {}; final Map> _innerEventMap = {}; - static void create( + static IsolateHandler create( T inst, - Object? initData, + Object? + initData /*, Function(IsolateEvent, Object?) isolateEventListener, - Function(IsoMessege) messageListener) async { + Function(IsoMessege) messageListener*/ + ) { var id = nonce; - instance._create( - inst, initData, id, isolateEventListener, messageListener); + var handler = IsolateHandler(id); + instance._create(inst, initData, id, handler._isolateEventHandler, + handler._isolateMessageHandler); + return handler; } void _create( @@ -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); } diff --git a/lib/platform/platform_base.dart b/lib/platform/platform_base.dart index 4b75626..3dc52ee 100644 --- a/lib/platform/platform_base.dart +++ b/lib/platform/platform_base.dart @@ -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 messageListenerMap); void write(String log); void end(); }