diff --git a/isolate_example/lib/page_three.dart b/isolate_example/lib/page_three.dart index ea1e506e0..043cb4190 100644 --- a/isolate_example/lib/page_three.dart +++ b/isolate_example/lib/page_three.dart @@ -11,10 +11,11 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; +import 'dart:typed_data'; import 'dart:isolate'; import 'dart:math'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; class DataTransferPageStarter extends StatelessWidget { @override @@ -67,7 +68,7 @@ class DataTransferIsolateController extends ChangeNotifier { SendPort _newIceSP; final currentProgress = []; - bool running = false; + int runningTest = 0; Stopwatch _timer = Stopwatch(); double progressPercent = 0; @@ -93,7 +94,7 @@ class DataTransferIsolateController extends ChangeNotifier { } if (message is String && message == 'done') { - running = false; + runningTest = 0; _timer.stop(); } @@ -103,25 +104,30 @@ class DataTransferIsolateController extends ChangeNotifier { void generateOnSecondaryIsolate() { if (running) return; - - running = true; - _timer.reset(); + runningTest = 3; currentProgress.clear(); + _timer = Stopwatch(); _timer.start(); _newIceSP.send('start'); notifyListeners(); } - Future generateRandomNumbers() async { + Future generateRandomNumbers(bool transferableTyped) async { if (running) return; - running = true; + if (transferableTyped) { + runningTest = 2; + } else { + runningTest = 1; + } + Random rng = Random(); - _timer = Stopwatch(); currentProgress.clear(); + + _timer.reset(); _timer.start(); List randNums = []; @@ -131,11 +137,18 @@ class DataTransferIsolateController extends ChangeNotifier { for (int j = 0; j < 1000000; j++) { randNums.add(rng.nextInt(100)); } - await sendNumbers(randNums); + + if (transferableTyped) { + final transferable = + TransferableTypedData.fromList([Int32List.fromList(randNums)]); + await sendNumbers(transferable); + } else { + await sendNumbers(randNums); + } } } - Future sendNumbers(List numList) async { + Future sendNumbers(dynamic numList) async { return Future(() { _newIceSP.send(numList); }); @@ -143,6 +156,8 @@ class DataTransferIsolateController extends ChangeNotifier { Isolate get newIsolate => _newIsolate; + bool get running => runningTest != 0; + void dispose() { super.dispose(); _newIsolate?.kill(priority: Isolate.immediate); @@ -186,17 +201,26 @@ class RunningList extends StatelessWidget { Future _secondIsolateEntryPoint(SendPort callerSP) async { ReceivePort newIceRP = ReceivePort(); callerSP.send(newIceRP.sendPort); + int length = 1; newIceRP.listen( (dynamic message) async { if (message is String && message == 'start') { - await generateAndSum(callerSP, createNums()); + await generateAndSum(callerSP, createNums(), length); callerSP.send('done'); - } else { - await generateAndSum(callerSP, message as List); + } else if (message is TransferableTypedData) { + await generateAndSum( + callerSP, message.materialize().asInt32List(), length); + length++; + } else if (message is List) { + await generateAndSum(callerSP, message, length); + length++; + } + if (length == 101) { callerSP.send('done'); + length = 1; } }, ); @@ -209,16 +233,17 @@ Iterable createNums() sync* { } } -Future generateAndSum(SendPort callerSP, Iterable iter) async { +Future generateAndSum( + SendPort callerSP, Iterable iter, int length) async { int sum = 0; - int count = 0; + int count = 1; for (int x in iter) { sum += x; - count++; - if ((count + 1) % 1000000 == 0) { - callerSP.send((count + 1) ~/ 1000000); + if (count % 1000000 == 0) { + callerSP.send((count ~/ 1000000) * length); } + count++; } return sum; @@ -235,11 +260,25 @@ Widget createButtons(BuildContext context) { RaisedButton( child: const Text('Transfer Data to 2nd Isolate'), elevation: 8.0, - onPressed: controller.generateRandomNumbers, + color: (controller.runningTest == 1) + ? Colors.blueAccent + : Colors.grey[300], + onPressed: () => controller.generateRandomNumbers(false), + ), + RaisedButton( + child: const Text('Transfer Data with TransferableTypedData'), + elevation: 8.0, + color: (controller.runningTest == 2) + ? Colors.blueAccent + : Colors.grey[300], + onPressed: () => controller.generateRandomNumbers(true), ), RaisedButton( child: const Text('Generate on 2nd Isolate'), elevation: 8.0, + color: (controller.runningTest == 3) + ? Colors.blueAccent + : Colors.grey[300], onPressed: controller.generateOnSecondaryIsolate, ), ], diff --git a/platform_view_swift/ios/Runner.xcodeproj/project.pbxproj b/platform_view_swift/ios/Runner.xcodeproj/project.pbxproj index b0cc31b7b..3f94bad1a 100644 --- a/platform_view_swift/ios/Runner.xcodeproj/project.pbxproj +++ b/platform_view_swift/ios/Runner.xcodeproj/project.pbxproj @@ -10,7 +10,6 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 2788264B20CF7D710075B10E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2788264A20CF7D710075B10E /* AppDelegate.swift */; }; 2788264D20CF7D790075B10E /* PlatformViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2788264C20CF7D790075B10E /* PlatformViewController.swift */; }; - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; 2DAF064E1ED4224F00716BEE /* ic_add.png in Resources */ = {isa = PBXBuildFile; fileRef = 2DAF064D1ED4224F00716BEE /* ic_add.png */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; @@ -46,7 +45,6 @@ 2788264920CF7D700075B10E /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 2788264A20CF7D710075B10E /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 2788264C20CF7D790075B10E /* PlatformViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlatformViewController.swift; sourceTree = ""; }; - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; 2DAF064D1ED4224F00716BEE /* ic_add.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ic_add.png; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; @@ -88,7 +86,6 @@ children = ( 3B80C3931E831B6300D905FE /* App.framework */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, 9740EEBA1CF902C7004384FC /* Flutter.framework */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, @@ -209,7 +206,6 @@ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,