Как вызвать electron main.ts или отправить сообщение компоненту angular

#angular #electron

#angular #electron

Вопрос:

Я знаю, как отправить сообщение или вызвать функцию из приложения angular в основной поток electron с помощью ipc.

Но в моем случае у меня есть какой-то поток, запущенный в основном потоке electron, например, обработка видео, и после некоторого процесса завершения файла electron требует отправки сообщения и параметра для обновления angular GUI.

Как основной поток electron (main.ts) может вызвать или вызвать angular EventEmitter для отправки некоторых данных обратно в приложение angular.

Ответ №1:

После попытки решить это действие в течение нескольких дней. Решение I для этого сценария — просто создать дескриптор ipcMain в main.ts и сохранить объект события для обратного вызова angular.

Структура папок проекта:

  • электронный проект
    • приложение angular
      • app.com.ts
      • app.com.html
    • main.ts
    • myelectron.com.ts
    • EventStore.ts
    • myelectonProcess.com.ts
  1. в приложении angular 1.1 конструктор — зарегистрировать обратный вызов ipcRenderer для получения сообщения от electron 1.2 конструктор — вызвать ipcMain в electron для принудительного создания объекта события.

   constructor(private electronService: ElectronService)
  {
    this.registerIPC();
  }

  registerIPC()
  {
      //register callback ipcRenderer to receipt message from electron
      this.electronService.ipcRenderer.on('my_process_msg', (event, result) => {
        this.processing = resu<
        //TODO do you logic here
      });

      //call ipcMain in electron to force create event object.
      this.electronService.ipcRenderer.send('my_process_msg');
  }  

  1. в electron main.ts при инициализации просто создайте объект myelectorn.com.ts

 //TODO your code

const main = () =>
{
  const myElec = new MyElectronCom();
  myElec.registerIpcMain();
}

//TODO your code

main();  

  1. в myelectron.com.ts — constructor — зарегистрируйте ipcMain.handle для получения первого подключения от angular. И сохраните этот объект события как глобальный объект для использования в другом приложении electron для отправки сообщения обратно в angular через объект event.

 export default class EventStore
{
  
  MyProcessEvent:any = null;

}  

 export default class MyElectonCom
{
  constructor()
  {
    this.registerIpcMain();
  }
  
  registerIpcMain()
  {
    //register to getEvent object for send scraping process status message.
        const {ipcMain} = require('electron');
        ipcMain.on('my_process_msg', (event) => {
            console.log('IPCMain event registered');
            
            //keep event object to resend again and again msg back to angular app.
            EventStore.MyProcessEvent = event;
            event.reply('my_process_msg', {progress:0, msg:'Registered'});
            
            //After this code and other class/coding can call EventStore.MyProcessEvent.send(....);
        });
  }

}  

  1. в другом коде electron разработчик может вызвать объект event для отправки данных обратно в приложение angular.

 export default class MyElectonProcessCom
{
  constructor()
  {
  }
  
  :
  :
  
  convertVideoFileProcessing(completedPercentage)
  {
    if(!empty(EventStore.MyProcessEvent){
        EventStore.MyProcessEvent.send('my_process_msg','Convert video to mp3 ' completedPercentage '%');
    }
  }
  
  convertVideoFileCompleted()
  {
    if(!empty(EventStore.MyProcessEvent){
        EventStore.MyProcessEvent.send('my_process_msg','Convert video to mp3 completed');
    }
  }

}