Массивы в PowerBuilder - PullRequest
       38

Массивы в PowerBuilder

0 голосов
/ 01 июля 2011

У меня есть этот код

n_userobject    inv_userobject[]

For i = 1 to dw_1.Rowcount()
inv_userobject[i] = create n_userobject
 .
 .
 .
NEXT 

dw_1.rowcount() возвращает только 210 строк.Это так странно, что в диапазоне от 170 приложение останавливается и вылетает на inv_userobject[i] = create n_userobject.Мой вопрос, есть ли какие-либо ограничения на объявление массива или userobject с использованием массивов?Я уже пытался уничтожить его после цикла, чтобы проверить, будет ли это возможным решением, но оно все еще не работает.Или как я могу каким-то образом refresh использовать пользовательский объект?Или кто-нибудь сталкивался с этим?

Спасибо за вашу помощь.

Ответы [ 4 ]

2 голосов
/ 04 июля 2011

Сначала проблема с памятью. Вы определенно не столкнетесь с ограничением массива. Если бы я предположил, одна из переменных экземпляра в n_userobject не очищается должным образом (то есть указывает на класс, который не уничтожается при уничтожении родительского класса) или указывает на класс, который аналогичным образом не ' убирайся. Если у вас есть PB Enterprise, я бы провел трассировку профилирования с меньшим циклом и посмотрел, что происходит при сборке мусора (есть утилита под названием CDMatch , которая действительно помогает этому процессу).

Во-вторых, давайте посмотрим правде в глаза, вы просто делаете это, чтобы избежать написания метода сброса. Даже если вы получите этот функционал, он никогда не будет таким эффективным, как написание собственного метода сброса и повторное использование одного и того же экземпляра. Да, это еще один метод, который вам придется поддерживать при изменении списка переменных экземпляра или по умолчанию, но вы легко вернете его обратно в производительность.

Удачи,

Терри.

1 голос
/ 03 июля 2011

Я предполагаю, что сбой, с которым вы сталкиваетесь, происходит на уровне PBVM, а не является обычным исключением PB (которое вы можете поймать в своем коде). Если я не прав, добавьте детали исключения.

Цикл из 170-210 итераций действительно невелик. Однако сбои в циклах обычно являются результатом исчерпания ресурсов. Что мы обычно делаем в длинных циклах, так это иногда вызываем GarbageCollect () . Как часто его следует вызывать, зависит от того, что делает ваш код - его частое использование может позволить использовать меньше памяти, но замедлит работу. Прочитайте это , чтобы узнать больше.

Если это не поможет, убедитесь, что ошибка не исходит от не-PB кода (импортированная DLL или около того). Вы можете проверить трассировку стека во время сбоя, чтобы увидеть происхождение исключения.

Наконец, если вас поддерживает Sybase (или местный представитель), вы можете отправить им аварийный дамп. Они могут проанализировать его и посмотреть, является ли это ошибкой в ​​PB, и если да, то сообщить вам, когда она была (или будет) исправлена.

0 голосов
/ 16 ноября 2011

единственное предложение, которое у меня есть для этого, это удалить счетчик строк из for (для i = 1 до dw_1.Rowcount ()), это заставит код пересчитывать строки каждый раз, когда он его использует. получить счет в переменную, а затем использовать переменную. он должен работать немного лучше и легче отлаживаться.

0 голосов
/ 01 июля 2011

Что я обычно делал бы с DataWindow - это создание объекта, который обрабатывает данные в строке и вызывает его для каждой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...