Re: Ошибка: Недостаточно памяти для выполнения опереации
Во время выполнения скрипта произошла вот такая ошибка:
System Error. Code: 14.
Недостаточно памяти для выполнения операции
CSDN.Tsc_Inventory
Это ошибка от недостатка физической памяти?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
TechnologiCS → TechnologiCS → Использование TechnologiCS API → Ошибка: Недостаточно памяти для выполнения опереации
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Во время выполнения скрипта произошла вот такая ошибка:
System Error. Code: 14.
Недостаточно памяти для выполнения операции
CSDN.Tsc_Inventory
Это ошибка от недостатка физической памяти?
AlexB писал(а):
Это ошибка от недостатка физической памяти?
Нет.
Вероятно решение тут -> https://forum.technologics.ru/viewtopic.php?id=986
Из ниже сказанного следует, что надо руками освобождать объекты, так что ли?
Есть у нас модуль, который проходя по вложенным спецификациям, вычисляет массу изделия. В нем все глобальные объекты освобождаются как надо (TCSApp.DeleteModuleByUserModuleName( "Имя" ) ), но проглотить ему состав изделия в 1500 позиций, так и не удается - обрабатывает ~1050 поз. и говорит "Out of memory мой друг - пользуйся мол калькулятором, excel-ем...". Во время отладки останавливается обычно не на глобальном объекте, а на X=ptModule.Properties['Parameters'].AsIDispatch, который по инструкции удаляется X := Nil; И глубина вложенности вреде бы не большая ~4 (на рекурсию особо и не погрешишь), просто подсборки объемные.
В ApiExplorer-e на глобальных объектах установлен флаг IModule.SingleInstance, это правильное предположение?
Я уже думаю все объекты что ли проверять на глобальность?
Кстати метод DeleteModuleByUserModuleName выполняется без сообщений и для объектов созданных, через Properties['...'].AsIDispatch, но легче от этого все равно не становится.
Если можно, перечислите модули TCS, для которых обновилось API в 463 по сравнению с 403, а то размеры файлов TCSApi.ocx немного различаются, но новых возможностей не видно, хотя ожидал.
И еще замечание: в справке есть куча примеров, в которых создаются объекты от TCSApp, но только наверное в одном можно встретить пример использования DeleteModuleByUserModuleName, это мне кажется и есть одна из основных причин множества одних и тех же вопросов по этой теме.
RAM = 512МБ и задействуется не вся.
Олег Зырянов писал(а):
Корневые объекты получаемые от Application (TCS_Application, OCS_Application) создаются в системе один раз и удалятся только при выгрузке программы.
Олег Зырянов писал(а):
Все остальные объекты (полученные через Properties, ChildModules ) удалются системой автоматически при отсутcтвии ссылок на них, либо при удалении родительского ообъекта.
т.е. нет смысла "проверять объекты на глобальность" и использовать DeleteModuleByUserModuleName для "объектов созданных, через Properties['...'].AsIDispatch"
Быть может Вы неправильно удаляете объекты(?) - без кода не понять
...на первый взгляд вроде нормально...в какой версии ошибка вылазит?...
v 4.3.4.0 (7875) под MS SQL 2000 sp4
Sh писал(а):
v 4.3.4.0 (7875) под MS SQL 2000 sp4
попробуйте в 4.6.3
Можно ли для начала просто подменить TCSApi.ocx
Sh писал(а):
Можно ли для начала просто подменить TCSApi.ocx
попробуйте )
Здраствуйте, уважаемые!
Я написал скрипт для выгрузки id позиций из фактической сдачи + ведение логов для дальней шей загрузки записей в 1С. У клиента на машине вылазит ошибка о нехватке памяти. Вот письмо, которое он мне написал по этому поводу:
"Нет возможности выгружать больше 10 а иногда и 7-ми дней сразу. Первоначально предполагалось, что компьютеру не хватает оперативной памяти для работы(512Мб). После экспериментов на сервере с объемом памяти 2Гб выяснилось, что проблема не в объёме памяти. В ходе дальнейших экспериментов выяснилось, что не хватает дескрипторов windows. Это проявляется в том, что после прекращения выполнения скрипта по ошибке в системе не возможно открыть никакого окна(Alt+Ctr+Del, или вообще закрыть TCS - окошко "Хотите выйти Да/Нет?"). Если же в системе закрыть любое окно(например если был открыт проводник и его закрыть), то сразу появляется возможность продолжить работу. Видимо проблема в высвобождении дескрипторов системы."
Я не знаю что на это ответить, может Вы знаете в чём проблемма и как это можно поправить?
Если нужно скрипт могу выложить.
Sub FormMacro_GetOperationToFile(TCSActiveModule)
On Error Resume Next
LogObject.ScriptTimeOut = 0
Dim Sostav
Dim Tp
Set fso = CreateObject("Scripting.FileSystemObject")
Set File = fso.OpenTextFile("C:\MI2.txt", 2, True)
Set Log_File = fso.OpenTextFile("C:\MI2.log", 2, True)
Log_File.Write CStr(Now)
ProductionBOM_ID = ""
ID = ""
IDPSp = ""
IStr = ""
IdsLast = ""
FBr = ""
pbStr = CSDN_VIS_Library.constProgressBarStr
TCSActiveModule.First
While Not TCSActiveModule.EOF
pbStr = CSDN_VIS_Library.ShowProgressBar(pbStr)
ProductionBOM_ID = ProductionBOM_ID + TCSActiveModule.Properties("PRODUCTIONBOM_ID").AsString + " "
ID = ID + TCSActiveModule.Properties("ID").AsString + " "
Set Sostav = TCSApp.Manufacturing.ProductionBOMStructure( TCSActiveModule.Properties("PRODUCTIONBOM_ID").AsInteger, -1, TCSActiveModule.Properties("PRODBOM_STRUCTUREITEM_ID").AsInteger )'Взять ПСп
Set Tp = Sostav.Properties("ProductionBOMProcess").AsIDispatch ' Взять ТП позиции состава ПСп
II = Tp.Locate( "ID", TCSActiveModule.Properties("PRODBOM_MNFPROCESSITEM_ID").AsInteger,0 )' Перейти к соответствующей операции
OperationNumber = Tp.Properties("OPERATION_NUMBER").AsSafeString
IStr = IStr + Tp.Properties("OPERATION_NUMBER").AsSafeString + " "
IDPSp = IDPSp + Tp.Properties("OPERATION_ID").AsSafeString + " "
Tp.First
While Not Tp.EOF
IdLast = Tp.Properties("OPERATION_NUMBER").AsSafeString
Tp.Next
Wend
IdsLast = IdsLast + IdLast + " "
Set Sostav = Nothing 'Освободить объект
Set Tp = Nothing 'Освободить объект
'Взять признак брака
Set OrderFact = TCSActiveModule.ChildModules.ModuleByName("OrderFact").AsIDispatch
If Not OrderFact Is Nothing Then
FBr = FBr + OrderFact.Properties("N_ORDFACT_DISCARD").DisplayText + " "
End If
Set OrderInfo = TCSActiveModule.ChildModules.ModuleByName("OrderInfo").AsIDispatch
If Not OrderInfo Is Nothing Then
SPsNote = OrderInfo.Properties("N_ORD_NOTE").AsString
End If
If TCSActiveModule.Properties("BATCH_NUMBER").DisplayText = "" And TCSActiveModule.Properties("SERIALNUMBER").DisplayText = "" Then
Log_File.Write Chr(10) + Chr(13) + "№ ПСп " + SPsNote + " № Операции " + OperationNumber + " - Отсутствует серийный номер партии или номер партии"
End If
If TCSActiveModule.Properties("FINISHEDPRODUCTS_DEPATMENT_SECTOR").DisplayText = "" Then
Log_File.Write Chr(10) + Chr(13) + "№ ПСп " + SPsNote + " № Операции " + OperationNumber + " - Отсутствует номер линии"
End If
Set WorkMans = TCSActiveModule.Properties("WorkMans").AsIDispatch
If Not WorkMans Is Nothing Then
WorkMan_ID = WorkMans.Properties("WORKMAN_ID").DisplayText
End If
If WorkMan_ID = "" Then
Log_File.Write Chr(10) + Chr(13) + "№ ПСп " + SPsNote + " № Операции " + OperationNumber + " - Отсутствует работник"
End If
If TCSActiveModule.Properties("DeliveryDate").DisplayText = "" Then
Log_File.Write Chr(10) + Chr(13) + "№ ПСп " + SPsNote + " № Операции " + OperationNumber + " - Отсутствует дата сдачи"
End If
Set WorkMans = TCSActiveModule.Properties("WorkMans").AsIDispatch
If Not WorkMans Is Nothing Then
WorkMans.First
While Not WorkMans.EOF
StandardHours = WorkMans.Properties("StandardHours").AsInteger
If StandardHours = 0 Then
LastName = WorkMans.Properties("WORKMAN_LASTNAME").DisplayText
Log_File.Write Chr(10) + Chr(13) + "№ ПСп " + SPsNote + " № Операции " + OperationNumber + " Работник: " + LastName + " - Отсутствует время"
End If
WorkMans.Next
Wend
End If
Set WorkMans = Nothing
TCSActiveModule.Next
Wend
IDs = ProductionBOM_ID + ID + IDPSp + IStr + IdsLast + FBr
File.Write IDs
File.Close
Log_File.Close
Call TCSApp.HideProgressMessage
End Sub
попробуйте заменить = Nothing на DeleteModuleByUserModuleName
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
TechnologiCS → TechnologiCS → Использование TechnologiCS API → Ошибка: Недостаточно памяти для выполнения опереации