FLUTTER 中 Isolate 的乙個例子

2022-06-05 06:54:08 字數 4740 閱讀 2880

最近看了一點isolate的東西, 自己寫了乙個例子.

普通的的 consummer-producer例子是只有前後兩端的,實際上,會把前後兩端再進行包裝.

我這裡這個例子,是把這個層級擴充,變成4層.

graph lr

a((消費者))--定單--> b((小商店))--定單-->c((批發商))--定單-->d((加工廠))

d--運送-->c--運送-->b--運送-->a

消費者 consummer 是乙個future,傳送請求,等待回覆, 不關心中間過程.

小商店 seller 是主線程的處理函式,響應consummer的請求,並把請求傳送給次執行緒的處理函式,

批發商 wholesale 是次執行緒的任務分發函式,可以把任務按同步的方式分發,也可以按非同步的方式分發,我的例子是非同步方式.

加工廠 producer 是執行任務的api, future. 在次執行緒執行.

同時,也要定義好前後通訊的資訊的格式.

dart**,flutter中的**就不放了.

import 'dart:isolate';

typedef futureapirets = futurefunction(apiargs args);

//api的引數的形式

class apiargs

}.tostring();

}}//api的返回值的形式

class apirets

}.tostring();

}}//seller 到 wholesale 的訊息的格式

class msg) : sendport = receiveport.sendport;

}//封裝 seller,wholesale 到乙個類裡,同時把執行緒的初始化和結束功能寫出來.

class isolatetest ) async ");

var rec = receiveport();

//與wholescale通過sendport通訊

isolatetest.sendport.send(msg(msg, rec, apiname: apiname, apiargs: args));

print("seller wait===:msg->$");

k ret = (await rec.first) as k;

print("seller end----:msg->$");

return ret;

} //wholesale功能,執行在次執行緒裡

static future wholesale(msg message) async :count->$count");

count++;

var ret;

//根據api的名稱來呼叫

if (msg.apiname != "")

} catch (e)

return ret;

};s().then((value) :count->$count");

reply.send(value);

});} else :count->$count");

reply.send(ret);}}

print('wholesale over');

} //建立次執行緒

static future createisolate() async

} //結束次執行緒

static closeisolate()

}}//次執行緒內,執行具體任務的api,封裝在乙個類裡,

class apitest ;

} string name;

mapapimap;

//apis

futureapia(apiargs args) async ],args:$");

await future.delayed(duration(seconds: 3));

apirets ret = apirets(["apia"], {});

print("producer apia---:name:[$],args:$");

return ret;

} futureapib(apiargs args) async ],args:$");

await future.delayed(duration(seconds: 4));

apirets ret = apirets(["apib"], {});

print("producer apib---:name:[$],args:$");

return ret;

} futureapic(apiargs args) async ],args:$");

await future.delayed(duration(seconds: 5));

apirets ret = apirets(["apic"], {});

print("producer apic---:name:[$],args:$");

return ret;

}}//使用者的呼叫測試

future consumer(int count, string name, string apiname) async );

print('consumer start++:$name,$count,$');

apirets ret = await isolatetest.seller(name, apiname: apiname, args: args);

print('consumer end----:$name,$count,$');

}main(listargs) async );

}

create isolate start

wholesale start

wholesale waiting

create isolate finish

consumer start++:aaa,1,}}

seller start++:msg->aaa

seller wait===:msg->aaa

consumer start++:aaa,2,}}

seller start++:msg->aaa

seller wait===:msg->aaa

consumer start++:aaa,3,}}

seller start++:msg->aaa

seller wait===:msg->aaa

consumer start++:bbb,4,}}

seller start++:msg->bbb

seller wait===:msg->bbb

wholesale start++:msg->aaa:count->0

producer apia+++:name:,args:}}

wholesale start++:msg->aaa:count->1

producer apib+++:name:,args:}}

wholesale start++:msg->aaa:count->2

producer apic+++:name:,args:}}

wholesale start++:msg->bbb:count->3

producer apia+++:name:,args:}}

producer apia---:name:,args:}}

wholesale end----:msg->aaa:count->4

seller end----:msg->aaa

consumer end----:aaa,1,}}

producer apia---:name:,args:}}

wholesale end----:msg->bbb:count->4

seller end----:msg->bbb

consumer end----:bbb,4,}}

consumer start++:ccc,5,}}

seller start++:msg->ccc

seller wait===:msg->cccwholesale start++:msg->ccc:count->4

wholesale end----:msg->ccc:count->5

seller end----:msg->ccc

consumer end----:ccc,5,null

producer apib---:name:,args:}}

wholesale end----:msg->aaa:count->5

seller end----:msg->aaa

consumer end----:aaa,2,}}

producer apic---:name:,args:}}

wholesale end----:msg->aaa:count->5

seller end----:msg->aaa

consumer end----:aaa,3,}}

close isolate

注意到中間 有部分的顯示有問題.

seller start++:msg->ccc

seller wait===:msg->cccwholesale start++:msg->ccc:count->4

wholesale end----:msg->ccc:count->5

這裡, 我分析是主次執行緒同時呼叫print()的時候,產生的亂碼.

Flutter中主題風格

flutter中主題風格可通過theme主題,那麼應用程式中的某些widget,就會直接使用主題的樣式。一 全域性theme theme themedata 1.亮度 brightness brightness.light,2.primaryswatch傳入不是color,而是materialcol...

Flutter學習 初識 Flutter

需要注意的資料夾 資料夾用途 android android 平台相關 iosios 平台相關 libflutter 相關 存放原始碼的地方 test 用於存放測試 pubspec.yaml 配置檔案,一般存放一些第三方庫 也可以簡寫 scaffold 是 material design 布局結構的...

Flutter中Widget與Element關係

widget widget 是 flutter 世界裡對檢視的一種結構化描述,你可以把它看作是前端中的 控制項 或 元件 widget 是控制項實現的基本邏輯單位,裡面儲存的是有關檢視渲染的配置資訊,包括布局 渲染屬性 事件響應資訊等。實際上,flutter 種真正代表螢幕上顯示元素的類時eleme...