Код ссылки: https://github.com/aredfox/screencapturerElectron UI BrowserWindow замерзает Основные BrowserWindow
Описание проблемы: Here является electron приложение с "MainWindow", который содержит кнопку "Пуск" захват. После щелчка он запускает событие для основного процесса, затем основной процесс запускает новый отдельный объект «BrowserWindow» с именем «captureWindow» с его собственными привязанными capture.html и capture.js. В capture.js каждые три секунды выполняется скриншот и сохраняется в c: \ temp \ screencap (это демонстрационное приложение, чтобы проиллюстрировать проблему, поэтому я не сделал этот настраиваемый и жестко закодированный путь на данный момент). Каждый раз, когда происходит захват в «craptureWindow», он зависает, чего я ожидал. Но объект «mainWindow» также замерзает, чего я не ожидал от него. Как мне обращаться с этим, так что mainWindow не замерзает, когда процесс запускается в другом объекте «BrowserWindow»? Я предположил, что у браузера Internet BrowserWindows (или «tabs») была отдельная нить?
EDIT 20/12/2016 Возможный виновник desktopCapturer.getSources().
ADDENDUM: обнаружено, что проблема должна быть внутри кодового блока getMainSource
, потому что, когда я кэширую этот «исходный» результат, он не замораживает весь электрон. Таким образом, должно быть, что метод фильтра или получение самого экрана вызывает проблему замораживания.
function getMainSource(desktopCapturer, screen, done) {
const options = {
types: ['screen'], thumbnailSize: screen.getPrimaryDisplay().workAreaSize
}
desktopCapturer.getSources(options, (err, sources) => {
if (err) return console.log('Cannot capture screen: ', err)
const isMainSource = source => source.name === 'Entire screen' || source.name === 'Screen 1'
done(sources.filter(isMainSource)[0])
})
}
Решения, хотя не кэшировать результат getMainSource (так называемого «источник»), так как это приведет к тем же данным изображений каждый раз, конечно. Я подтвердил, что, записывая файл в формате png, и, действительно, каждый скриншот тогда был тем же самым, даже если на рабочем столе было достаточно. TODO: Возможная опция - настроить видеопоток и сохранить изображение из потока?