Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Взятие данных в Основном процессе в Электроне (https://javascript.ru/forum/node-js-io-js/74202-vzyatie-dannykh-v-osnovnom-processe-v-ehlektrone.html)

Andrew K 21.06.2018 07:49

Взятие данных в Основном процессе в Электроне
 
Здравствуйте! Пишу программу на Электроне. В процессе работы пользователя программа сохраняет данные в массиве. Мне эти данные нужно получить в Основном процессе. Проблема в том, что программа всегда возвращает данные, которые изначально были в массиве при старте программы полностью игнорируя все изменения. Они как будто кешируются. Хотя на старте программы эти данные не запрашиваются.

Я пошел другим путем и написал функцию возвращающую массив данных. В этом случае кеша точно не может быть. Но снова возвращается изначальный массив.

Почему программа так странно себя ведет? Как в Основном процессе получить массив с текущими данными?

stweet 21.06.2018 11:35

Эм... 42

Andrew K 21.06.2018 11:40

Цитата:

Сообщение от stweet (Сообщение 487999)
Эм... 42

Что это за магическое число?

stweet 21.06.2018 12:00

42

stweet 21.06.2018 15:30

А чем вам ответ "42" не устроил? Хорошо, давай-те попробуем разжевать.

У меня есть холодильник, ложу в него масло, через некоторое время открываю а масла в нём нет! Пошел другим путем и масло теперь, сначала в корзинку ложу и снова в холодильник. И снова фиаско! Масло опять исчезает =/
Может ли мне кто ни будь подсказать, почему так странно ведет себя холодильник?

Ну и по факту, что вы там делаете, как запускаете, что за код у вас там, лицом ли вы сидите к монитору? До этого вероятные помощники догадываться должны? Конкретике больше а то от заголовка веет не задачей а размышлением. Чем больше деталей тем явнее ответ. И на ваш вопрос ответом "42" был не спроста! Думал смекнете. А нет, сочли спамом дельную мысль.

Andrew K 21.06.2018 16:17

Тут нет никакого особенного кода. Поэтому и не писал. Обычное подключение файла, в котором экспортируется массив.

Есть файл с массивом. В процессе работы программы массив наполняется данными. В файле Основного процесса (main.js) массив через require() подключается в функции. Функция вызывается через некоторое время после запуска программы. К этому времени в массиве уже 100% есть данные. Затем функция выводит данные в консоле. Все абсолютно примитивно:

main.js
// Старт программы
app.on( 'ready', function(){
   ... код создание окна и другие действия не относящиеся к подключению файла...

    // Импортировать массив с данными через 3 секунды и показать содержимое
    setTimeout(function () {
        let sceneElems = require('../renderProcess/editorJS/sceneElems').sceneElems;

        console.log(sceneElems);
    }, 3000);
} );


Но этот код выводит содержимое массива, которое было при старте программы. Если был пустой массив, то пустой, если другие данные, то это данные. А до вызова функции возвращающей содержимое массива в нем данные меняются. И такое происходит только в Основном процессе. В процессе Отображения этот код срабатывает как нужно.

Andrew K 21.06.2018 16:41

Спасибо за ответ! Попробую в начале сохранить данные массива как файл и затем прочесть из Основного процесса.

Цитата:

Сообщение от Audaxviator
Всё, что загружается через require, загружается в оперативную память (даже не в кеш) и больше не изменяется.

Это особенность работы Основного процесса? Я помню теорию подключения файлов в Ноде: при подключении файла данные возвращаются в виде объекта. А у объекта доступ по ссылке. Поэтому при изменении данных они будут всегда актуальны в каждом файле. Собственно все подключаемые файлы в Процессе Отображения вели себя в соответствии с этим правилом.

EmperioAf 21.06.2018 23:28

Мммммм, не надо придумывать велосипедов, если уж пользуетесь Electron, то лучше начать с чтения документации:

https://electronjs.org/docs/api/ipc-renderer

stweet 22.06.2018 10:46

1. Раскуриваем анонимность в JS
2. Вновь импортированный модуль это вновь выделенная память и с предыдущим импортом общего ни чего не имеет.

// Старт программы

let model = [] // your import array(yes, in begin programm)
// let sceneElems = require('../renderProcess/editorJS/sceneElems').sceneElems;

app.on( 'ready', function(){
    // код создание окна и другие действия не относящиеся к подключению файла...
    
    // use array

	setTimeout(function () {

        // array operations
        model.push('arguments')


	    console.log(model);
	}, 3000);
});


Так же хотелось бы посмотреть файл в котором экспортируется массив.

Andrew K 22.06.2018 11:30

Спасибо EmperioAf за наводку на правильный путь! Документацию читал, то даже в голову не пришло что так можно было.

Напишу как понял почему программа так себя вела.

Файлы Основного процесса и процесса Отображения находятся как бы каждый в своей песочнице. Если просто обратиться к файлу из другого процесса, то он возвратит данные, которые находятся в файле. А при работе сценария новые данные записываются не в файл, а в оперативную память.

Для передачи данных между двумя процессами есть модуль IPC. В моем случае нужно из Основного процесса передать сообщение на запрос данных. В процессе Представления запрос будет услышан и отправлено сообщение с массивом данных. И в конце в Основном процессе будет получено сообщение с массивом из процесса Отображения.

Код:

main.js
// Отправить запрос в процесс Представления на получение массива элементов сцены
mainWindow.webContents.send('get-scene-arr');

// Получить ответ...
ipcMain.on('dispatch-scene-arr', (e, sceneElems) => {
	// Вывести данные в консоле
    console.log( sceneElems );
});


render.js
// Получить запрос из Основного процесса на получение массива с элементами сцены
ipcRenderer.on('get-scene-arr', function (e, args) {

	// Отправить сообщение в Основной процесс с массивом элементов сцены
	ipcRenderer.sendSync('dispatch-scene-arr', sceneElems);
});


Часовой пояс GMT +3, время: 07:23.