最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Electron進(jìn)程間通信的實(shí)現(xiàn)

 更新時(shí)間:2022年05月24日 11:31:28   作者:Hansel.Wn  
本文主要介紹了Electron進(jìn)程間通信的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

使用Electron開發(fā)出來(lái)的桌面應(yīng)用都是多進(jìn)程的,其中包含了一個(gè)主進(jìn)程(Main)和至少一個(gè)渲染進(jìn)程(Renderer)。

主進(jìn)程控制整個(gè)應(yīng)用的生命周期,通過(guò)electron中的一些模塊與GUI交互,同時(shí)控制每一個(gè)渲染進(jìn)程。

渲染進(jìn)程會(huì)在BrowserWindow對(duì)象創(chuàng)建出的窗口中渲染出Web頁(yè)面,每個(gè)渲染頁(yè)面都運(yùn)行在獨(dú)立的進(jìn)程中。

主進(jìn)程與渲染進(jìn)程之間通信

ipc模塊 + window.webContents

ipc模塊包含ipcMain和 ipcRenderer兩個(gè)模塊,其中ipcMain在主進(jìn)程中使用,ipcRenderer在渲染進(jìn)程中使用,在使用之前,要使用require引入對(duì)應(yīng)的模塊。

ipc模塊中的方法:

  • ipcMain.on(msg, () => {}):監(jiān)聽渲染進(jìn)程發(fā)送的msg消息,并做出響應(yīng)。
  • ipcMain.once(msg, () => {}):監(jiān)聽渲染進(jìn)程發(fā)送的msg消息,并做出響應(yīng),但是監(jiān)聽到一次msg事件后自動(dòng)移除這個(gè)監(jiān)聽器。
  • ipcRenderer.on(msg, () => {}):監(jiān)聽主進(jìn)程發(fā)送的msg消息,并做出響應(yīng)。
  • ipcRenderer.once(msg, () => {}):監(jiān)聽主進(jìn)程發(fā)送的msg消息,并做出響應(yīng),但是監(jiān)聽到一次msg事件后自動(dòng)移除這個(gè)監(jiān)聽器。
  • ipcRenderer.send(msg, data):監(jiān)聽渲染進(jìn)程向主進(jìn)程發(fā)送msg異步消息,并攜帶參數(shù)data。
  • ipcRenderer.sendSync(msg, data):監(jiān)聽渲染進(jìn)程向主進(jìn)程發(fā)送msg同步消息,并攜帶參數(shù)
  • ipcRenderer.sentTo(webContentId, msg, data):監(jiān)聽渲染進(jìn)程向具有webContentId的窗口發(fā)送消息
  • ipcRenderer.sendToHost(msg, data):監(jiān)聽渲染進(jìn)程向host頁(yè)面上的 <webview> 元素發(fā)送消息

ipc模塊還提供了刪除指定監(jiān)聽器和刪除所有監(jiān)聽器的方法:removeListener()、removeAllListener(),這兩個(gè)方法在ipcMain和ipcRenderer這兩個(gè)模塊中的用法是一樣的。

通過(guò)上面的幾個(gè)監(jiān)聽器我們發(fā)現(xiàn),單獨(dú)使用ipc模塊無(wú)法實(shí)現(xiàn)主進(jìn)程主動(dòng)向渲染進(jìn)程發(fā)送消息。所以我一般把BrowserWindow實(shí)例中的webContents和ipc模塊結(jié)合使用

一個(gè)主進(jìn)程與渲染進(jìn)程間通信的例子

// 在主進(jìn)程中使用ipcMain
const { ipcMain, BrowserWindow } = require('electron');

window = new BrowserWindow({
?? ?width: 800,
?? ?height: 600
});

// 主進(jìn)程主動(dòng)向渲染進(jìn)程發(fā)送消息
window.webContents.send('main webContents msg', data);

// 主進(jìn)程接收渲染進(jìn)程發(fā)送的消息,并通過(guò)回調(diào)函數(shù)做出響應(yīng)
ipcMain.on('renderer ipc msg', (event, arg) => {
?? ?// TODO something
})
// 在渲染進(jìn)程中使用ipcRender
const ipcRender = require('electron');

// 渲染進(jìn)程中使用ipcRenderer.on接收主進(jìn)程消息,并通過(guò)回調(diào)函數(shù)做出相應(yīng)
ipcRenderer.on('main webContents msg', (event, arg) => {
?? ?// 在相應(yīng)主進(jìn)程事件時(shí),通過(guò)ipcRenderer.send方法像主進(jìn)程發(fā)送另一條消息
?? ?ipcRenderer.send('renderer ipc msg', data);
})

ipcRenderer發(fā)送的同步消息和異步消息

在上面列舉的幾個(gè)方法中,其中ipcRenderer發(fā)送消息的方法分為發(fā)送同步消息的方法ipcRenderer.send和發(fā)送異步消息的方法ipcRenderer.sendSync。主程序在監(jiān)聽到這兩種不同方法的消息時(shí),可以通過(guò)不同的方式給渲染進(jìn)程返回消息:

// 渲染進(jìn)程

// 渲染進(jìn)程發(fā)送異步消息
ipcRenderer.send('msg', data);

// 渲染進(jìn)程發(fā)送同步消息。 發(fā)送同步消息,任務(wù)未完成時(shí)會(huì)阻止其他操作
var message = ipcRenderer.sendSync('sync msg', data);
ipcMain.on('msg', (event, arg) => {
?? ?// 主進(jìn)程監(jiān)聽到渲染進(jìn)程發(fā)的異步消息后,通過(guò)event.sender.send()的方式進(jìn)行響應(yīng),可以在渲染進(jìn)程中使用ipcRenderer.on監(jiān)聽'return msg'消息
?? ?event.sender.send('return msg', data)
})

ipcMain.on('sync msg', (event, arg) => {
?? ?event.retuenValue = 'msg';
})

remote模塊

在渲染進(jìn)程中使用remote,可以調(diào)用主進(jìn)程所提供的一些方法。(例如:dialog、menu等模塊)

const { BrowserWindow } = require('electron').remote;

//通過(guò)remote模塊,可以在渲染進(jìn)程中調(diào)用BrowserWindow模塊
let win = new BrowserWindow({ width: 800, height: 600});
win.loadURL('index.html');

渲染進(jìn)程中使用remote模塊返回的對(duì)象,都代表了主進(jìn)程中的一個(gè)對(duì)象,一般稱為遠(yuǎn)程對(duì)象。調(diào)用遠(yuǎn)程對(duì)象的方法時(shí),實(shí)際上是在想主進(jìn)程發(fā)送同步消息。

比如上面的代碼中,BrowserWindow實(shí)例是通過(guò)remote模塊返回的,所以渲染進(jìn)程中的BrowserWindow和win都是遠(yuǎn)程對(duì)象。在執(zhí)行new BrowserWindow({...})這段代碼的時(shí)候,并沒有在渲染進(jìn)程中創(chuàng)建BrowserWindow實(shí)例的對(duì)象,而是在主進(jìn)程中創(chuàng)建了BrowserWindow對(duì)象,并把這個(gè)對(duì)象返回到渲染進(jìn)程中。

remote的方法和屬性

  • remote.require(module):返回主進(jìn)程中的對(duì)象
  • remote.getCurrentWindow():返回此網(wǎng)頁(yè)所屬的窗口
  • remote.getGlobal(name):返回主進(jìn)程中name的全局變量
  • remote.process:返回主進(jìn)程中的process對(duì)象

渲染進(jìn)程之間通信

上面提到的通信方法,經(jīng)過(guò)測(cè)試發(fā)現(xiàn)都無(wú)法在渲染進(jìn)程之間直接通信,有時(shí)候我們開發(fā)中可以使用主進(jìn)程作為中轉(zhuǎn)進(jìn)行渲染進(jìn)程間的通信:

// renderer process A
const { ipcRenderer } = require('electron');
ipcRenderer.send('A send msg', data);
// main process
const { ipcMain, BrowserWindow } = require('electron');

let win = new BrowserWindow({...});

ipcMain.on('A send msg', (event ,arg) => {
?? ?// TODO something
?? ?win.webContents.send('main send msg', data);
})
const { ipcRenderer } = require('electron');
ipcRenderer.on('main send msg', (event, arg) => {
    // TODO something
})

除了上面這種需要main process中轉(zhuǎn)的方式之外,還有一種方式能夠?qū)崿F(xiàn)渲染進(jìn)程之間的直接通信:

// main process
// 兩個(gè)窗口互相獲取對(duì)方的窗口 id, 并發(fā)送給渲染進(jìn)程
const { BrowserWindow} = require('electron');

let win1 = new BrowserWindow({...});
let win2 = new BrowserWindow({...});

win1.webContents.send('distributeIds',{
? ? win2Id : win2.id
});
win2.webContents.send('distributeIds',{
? ? win1Id : win1.id
});
// renderer process
const { remote } = require('electron').remote;

// fromId() 可以根據(jù)窗口id找到目標(biāo)窗口
remote.BrowserWindow.fromId(win2Id).webContents.send('msg', data);

到此這篇關(guān)于Electron進(jìn)程間通信的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Electron進(jìn)程間通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue實(shí)現(xiàn)文章評(píng)論和回復(fù)列表

    vue實(shí)現(xiàn)文章評(píng)論和回復(fù)列表

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)文章評(píng)論和回復(fù)列表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • vue之computed的緩存特性

    vue之computed的緩存特性

    這篇文章主要介紹了vue之computed的緩存特性,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Vue動(dòng)態(tài)樣式幾種常用方法總結(jié)

    Vue動(dòng)態(tài)樣式幾種常用方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于Vue動(dòng)態(tài)樣式幾種常用方法總結(jié)的相關(guān)資料,在我們的前端界面中,很多的地方的樣式都是不確定的狀態(tài),要根據(jù)其他內(nèi)容的變化而變化樣式的,需要的朋友可以參考下
    2023-08-08
  • Vue編譯器AST抽象語(yǔ)法樹源碼分析

    Vue編譯器AST抽象語(yǔ)法樹源碼分析

    這篇文章主要為大家介紹了Vue編譯器AST抽象語(yǔ)法樹源碼分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • vue3 elementplus table合并寫法

    vue3 elementplus table合并寫法

    這篇文章主要介紹了vue3 elementplus table合并寫法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • vue如何自定義組件v-model

    vue如何自定義組件v-model

    這篇文章主要介紹了vue如何自定義組件v-model問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • vue-router如何實(shí)現(xiàn)history模式配置

    vue-router如何實(shí)現(xiàn)history模式配置

    這篇文章主要介紹了vue-router如何實(shí)現(xiàn)history模式配置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • vue中實(shí)現(xiàn)打印功能的幾種方法示例

    vue中實(shí)現(xiàn)打印功能的幾種方法示例

    這篇文章主要給大家介紹了關(guān)于vue中實(shí)現(xiàn)打印功能的幾種方法,打印功能在實(shí)際開發(fā)中非常常見,通常我們需要將網(wǎng)頁(yè)中的某一部分或整個(gè)網(wǎng)頁(yè)打印出來(lái),需要的朋友可以參考下
    2023-09-09
  • vue如何判斷數(shù)組中的對(duì)象是否包含某個(gè)值

    vue如何判斷數(shù)組中的對(duì)象是否包含某個(gè)值

    這篇文章主要介紹了vue如何判斷數(shù)組中的對(duì)象是否包含某個(gè)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • vue 移動(dòng)端注入骨架屏的配置方法

    vue 移動(dòng)端注入骨架屏的配置方法

    骨架屏就是在頁(yè)面未渲染完成的時(shí)候,先用一些簡(jiǎn)單的圖形大致勾勒出頁(yè)面的基本輪廓,給用戶帶來(lái)更好的體驗(yàn)。這篇文章主要介紹了vue 移動(dòng)端注入骨架屏,需要的朋友可以參考下
    2019-06-06

最新評(píng)論

安徽省| 毕节市| 曲靖市| 西青区| 祁东县| 和硕县| 三亚市| 伊宁市| 嘉善县| 湟中县| 麦盖提县| 嵊泗县| 康马县| 无为县| 博兴县| 东平县| 新绛县| 弥渡县| 大渡口区| 苍山县| 乡宁县| 平武县| 云林县| 志丹县| 兴隆县| 原阳县| 乌苏市| 桦南县| 正阳县| 塘沽区| 肇源县| 柳州市| 双江| 通江县| 沽源县| 邮箱| 鄂托克旗| 阿鲁科尔沁旗| 南雄市| 郧西县| 杭锦后旗|