Чтение / запись файла, вызывающего ошибки. (javaScript & C ++)

0

У меня есть часть javaScript, которая работает (наряду с html) для создания графического интерфейса для программы, написанной в C++. Программа должна работать в течение длительного времени (иногда 14/15 дней без мониторинга).

C++ и javaScript общаются путем записи/чтения из файла XML.

После запуска программы более 24 часов за один раз, я заметил случайную ошибку javaScript, отображающую "someArray [...]. Name" является нулевым или не является объектом.

Теперь: это все массивы, заполненные информацией, взятой из файла XML, написанной C++. Содержимое этих массивов обновляется каждые несколько секунд (для обновления информации в графическом интерфейсе "live").

Вопрос: могут ли эти ошибки быть вызваны проблемой доступа/таймера, как в → javaScript начинает считывать строку из XML так же, как C++ набирает и переписывает эту строку. Поэтому информация анализируется в массивах javaScript с некоторыми недопустимыми символами (и т.д.), Которые при доступе вызывают ошибки?

Надеюсь, что все имеет смысл. Благодарю.

  • 1
    Можете ли вы дать нам точную ошибку.
  • 0
    ошибка: ['properties [...]. name' равно null или не является объектом] и в строке, которая гласит: for (var i=0; i<properties.length; i++) { if (properties[i].name == name) { return properties[i].value; } }
Показать ещё 4 комментария
Теги:
runtime-error

1 ответ

1
Лучший ответ

Ваше предложение, кажется, дает правдоподобное объяснение того, что происходит. Вероятно, вы видите состояние гонки.

Чтобы исправить это, вы можете реализовать механизм синхронизации между 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, вы можете прочитать его несколько раз за несколько, скажем, секунд, и, если они не изменились, используйте значение чтения. Если изменилось, продолжайте ждать.

НТН

  • 0
    Спасибо Мау! «Состояние гонки» -> Это линия, которую я искал. Я учусь в индустрии размещения и имею доступ только к javaScript, поэтому, боюсь, любое решение должно пройти через этот конец кода. (Тем не менее, я собираюсь предложить ваш ответ). В настоящее время пытается ввести условия для проверки XML, пока он анализируется в javaScript. Надеюсь, что это может помочь.
  • 1
    @ User2, см. Мои правки :)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню