2022年7月30日 星期六

用 dart 語法將 function/task 的迴圈改成遞迴函式運作

當一個  function/task 用迴圈(while/for/do-while)處理狀態機(state machine)時, 如下所述:
import 'dart:async';
int step = 0;
void functionTask( )  async {
    for (int i = 0; i < loopMax; i++) {
        switch(step) {
            case 0: // ...
                    step ++;
                    break;
            case 1: //...
                    step ++;
                    break;
            // ...
            // case n: step ++;
            //      break ;
            default: step = 0;
                    break;
        }
       await  Future.delayed(Duration(microseconds: 0)); // schedule, to run ASAP
       if (step == 0) break;
    }
    return;
}

這樣的寫法會造成程序(thread)堵(blocking)在迴圈內, 如果用在 Flutter 平台(Platform)上, 將沒機會處理內部訊息(message queue), 導致 Widget 無法同步更新, 或者看不到畫面, 此外 StatefulWidget  管理狀態(state)時,  在 initState( ) 或是 build( ) 的 function/task 內是不能使用 async/await 的,  但可以註冊類同步(then)方式來運作,  搭配遞迴函式編寫方式移除迴圈, 同上述  function/task 的狀態機處理函式就能活動不停, 同步更新畫面, 直到結束:
import 'dart:async';
int step = 0;
Future<int>   async_Task( )  async { // 非同步涵式    
        switch(step) {// 現在函式
            case 0: // ...
                    step ++;
                    break;
            case 1: //...
                    step ++;
                    break;
            // ...
            // case n: step ++;
            //      break ;
            default: step = 0;
                    break
        }  
        await Future.delayed(Duration(microseconds: 1000000)); // return the 'Future'.
        // 未來函式 ...
        return step ;// 未來函數, 接觸點
}

        // ... in  stateManagement  class  ...
        void recursiveLoop( ) {// 類同步註冊: 接觸過往, 持續未來
           
async_Task( ) .then((result) {
                if (result > 0) setState ( ( ) =>
recursiveLoop( ) );// 接序函式: 建新 widget, 更新畫面
            });
        }

       
        @override  void  initState( ) {
            super .initState( );
            recursiveLoop( );
        }

沒有留言:

張貼留言

使用 pcie 轉接器連接 nvme SSD

之前 AM4 主機板使用 pcie ssd, 但主機板故障了沒辦法上網, 只好翻出以前買的 FM2 舊主機板, 想辦法讓老主機復活, 但舊主機板沒有 nvme 的界面, 因此上網買了 pcie 轉接器用來連接 nvme ssd, 遺憾的是 grub2 bootloader 無法識...