概念的に「プッシュ」と「ポーリング」ストリームを参照して、「* Dart の stdin ストリームのデータ フロー動作をエミュレートするプッシュデータ ストリームを作成する」という質問の目的を説明します。
「ポーリング」:前の質問で、メンゾーニの回答は「ポーリング」ストリームの好例です。ストリームは常に開始され、Dart コンソール アプリからネイティブ拡張にデータが要求されます。要求が満たされ、応答がアプリに返されます。これは、私の経験から、典型的な Dart ストリームの使用法です。
" Pushed ": 外部ソースから到着したデータがコンソール アプリにプッシュされました。データの発信元と転送テクノロジは問題ではありません。標準入力のキーボード/マウス イベント、PLC 割り込み、データベースの非同期通知などである可能性があります。
この図では stdin ストリームを使用します。これは、達成しようとしているデータ フローの良い例です。virtualkeycodes/int の形式のデータは、ネイティブ拡張内に到着し、バッファリングされます。その後、アプリからのデータのプル/ポーリング リクエストを必要とせずに、Dart アプリに「プッシュ」(送信/投稿) する必要があります。これは、ネイティブ拡張のカスタム ストリームで達成しようとしている目的です。
Dart コンソール アプリの擬似コード:
Stream<List<int>> virtKeyCodes = NativeCreatePushedStream_Keycodes();
virtKeyCodes.listen(processInts);
void processInts(List<int> kbinput) {
print("processInts: found ${kbinput.length} kbinput chars");
for (int i = 0; i < kbinput.length; i++) {
print("...kbinput:${kbinput[i]}");
}
}
ネイティブ拡張の疑似コード (私はここで推測しています! )
Initial call create persistant stream
Return to console app where it starts to listen
onDataReady somehow post ints to stream
DartVM pushes to console app
ご協力いただきありがとうございます。