Многопоточность
FastScript не работает в многопоточном режиме! Точнее работает но глючит по черному
По порядку: запускаю несколько потоков, в каждом потоке свой DataModule, на нем TfsScript, TfsPascal, TfsClassesRTTI и т. д. Выполняется один и тот же скрипт, он читает таблицу и пишет в файл(для каждого потока свой) несколько полей примерно так:
field1
field2
field3
field1
field2
field3
...
Так вот, при запуске в многопоточном режиме порядок полей в выходном файле нарушается случайным образом. Такое впечатление, что нарушается порядок выполнения команд или на обьекты "гуляют" из потока в поток.
По порядку: запускаю несколько потоков, в каждом потоке свой DataModule, на нем TfsScript, TfsPascal, TfsClassesRTTI и т. д. Выполняется один и тот же скрипт, он читает таблицу и пишет в файл(для каждого потока свой) несколько полей примерно так:
field1
field2
field3
field1
field2
field3
...
Так вот, при запуске в многопоточном режиме порядок полей в выходном файле нарушается случайным образом. Такое впечатление, что нарушается порядок выполнения команд или на обьекты "гуляют" из потока в поток.
Комментарии
Проблема с многопоточностью в использовании глобального модуля! См. fsGlobalUnit.
Вывод: для каждого потока нужно использовать свой "глобальный" модуль.
1.Переписываем нужные юниты fs_iXXXrtti.pas так:
........... ........... ..........
Определение TFunctions выносим в секцию interface.
Добавляем поле FParentUnit:TfsScript;
Меняем констрактор constructor Create(ParentUnit:TfsScript);
и дестрактор для работы с FParentUnit.
В секции initialization теперь будем вызывать:
Functions := TFunctions.Create(fsGlobalUnit);
То есть для однопоточного режима практически ничего не меняется!
2. В многопоточном режиме, в каждом потоке:
Все, теперь с fsScript1 можно работать!