Isolate 정리

This commit is contained in:
leedongmyung[desktop] 2023-11-03 19:49:21 +09:00
parent 85152b0930
commit cc0433b256
6 changed files with 150 additions and 75 deletions

View file

@ -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++;
}
}
}

View file

@ -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});
}

View file

@ -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() {

View file

@ -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

View file

@ -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);
}

View file

@ -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();
}