У меня есть часть javaScript, которая работает (наряду с html) для создания графического интерфейса для программы, написанной в C++. Программа должна работать в течение длительного времени (иногда 14/15 дней без мониторинга).
C++ и javaScript общаются путем записи/чтения из файла XML.
После запуска программы более 24 часов за один раз, я заметил случайную ошибку javaScript, отображающую "someArray [...]. Name" является нулевым или не является объектом.
Теперь: это все массивы, заполненные информацией, взятой из файла XML, написанной C++. Содержимое этих массивов обновляется каждые несколько секунд (для обновления информации в графическом интерфейсе "live").
Вопрос: могут ли эти ошибки быть вызваны проблемой доступа/таймера, как в → javaScript начинает считывать строку из XML так же, как C++ набирает и переписывает эту строку. Поэтому информация анализируется в массивах javaScript с некоторыми недопустимыми символами (и т.д.), Которые при доступе вызывают ошибки?
Надеюсь, что все имеет смысл. Благодарю.
Ваше предложение, кажется, дает правдоподобное объяснение того, что происходит. Вероятно, вы видите состояние гонки.
Чтобы исправить это, вы можете реализовать механизм синхронизации между C++ и JS. Простейшая форма синхронизации, о которой я могу думать, заключается в создании второго файла каждый раз, когда C++ записывает в ваш основной файл XML (этот файл действует как блокировка). JS ожидает, что файл блокировки исчезнет перед чтением XML. То же самое делается на стороне C++.
Образец кода:
C++:
while(programRunning) {
do stuff;
// Now it time to write XML
while("lockCpp.txt" exists)
; // Do nothing, JS is reading
create file "lockJS.txt";
write to xml;
delete file "lockJS.txt";
}
JavaScript:
while(programRunning) {
do stuff;
// Now it time to read XML
while("lockJS.txt" exists)
; // Do nothing
create file "lockCpp.txt";
read xml;
delete file "lockCpp.txt";
}
Это должно на практике устранить условия гонки (хотя некоторые из них теоретически возможны, но маловероятны).
Если JS не разрешено записывать в файловую систему, вы можете удалить один из файлов блокировки (lockCpp.txt), и если чтение на стороне JS обычно быстрее, чем запись, оно должно по-прежнему устранять большинство конфликтов.
EDIT после комментария:
Если у вас есть только доступ к JS, вы можете проверить, что XML-документ завершен при чтении, например, корневой элемент в конце сопоставляется с </rootElementName>
. Это обеспечит полную запись файла, если C++ не выполняет записи в случайных местах, но всегда переписывает весь документ.
Другим маршрутом будет проверка того, что файл со временем не меняется. Если C++ только спорадически записывает в XML, вы можете прочитать его несколько раз за несколько, скажем, секунд, и, если они не изменились, используйте значение чтения. Если изменилось, продолжайте ждать.
НТН
for (var i=0; i<properties.length; i++) { if (properties[i].name == name) { return properties[i].value; } }