Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

Размер стека   Найти похожие ветки 

 
Alex_Korn ©   (2005-10-11 14:21) [0]

Как определить какую часть стековой памяти
занимает программа в данный момент времени ?


 
Digitman ©   (2005-10-11 14:42) [1]

хм... непонятно что тебя интересует ...

попробую протелепатировать :

procedure TForm1.Button3Click(Sender: TObject);
var
 p: Pointer;
 mbi: TMemorybasicInformation;
begin
 asm
   mov p, esp;
 end;
 VirtualQuery(pointer(findhinstance(p)), mbi, sizeof(mbi));
 showmessage(inttohex(mbi.RegionSize, 8));
end;


 
Alex_Korn ©   (2005-10-12 07:35) [2]

Digitman ©   (11.10.05 14:42) [1]
Спасибо !
Я имел ввиду следующее:
Бывает ошибка - "Stack overload".
Я в программе использую рекурсию и меня интересует вопрос
сколько процентов стека я занял на данный момент от "Stack overload".


 
MBo ©   (2005-10-12 07:53) [3]

>Я в программе использую рекурсию и меня интересует вопрос
Такие проблемы решаются тщательным планированием алгоритма с целью (разумного) ограничения рекурсии. Во многих случаях от нее вообще можно избавиться.


 
Alex_Korn ©   (2005-10-12 09:04) [4]

MBo ©   (12.10.05 7:53) [3]
Рекурсия у меня ограничена количеством элементов, которые надо
обработать. Их ( элементов ) фиксированное число, имеющее
верхнюю границу.
Отказываться от рекурсии, в моем случае, нецелесообразно.


 
MBo ©   (2005-10-12 09:08) [5]

Что за алгоритм?


 
Leonid Troyanovsky ©   (2005-10-12 09:43) [6]


> Alex_Korn ©   (12.10.05 07:35) [2]

> Я в программе использую рекурсию и меня интересует вопрос
> сколько процентов стека я занял на данный момент от "Stack
> overload".


В тот момент, когда появляется Stack overflow поздно считать проценты,
бо все, что можно было выделить потоку было выделено (стек растет
динамически, по мере необходимости).

Самая распространенная причина - ошибка в рекурсивных функциях,
от коих и следует тщательнейшим образом избавляться (ничего
сверхестественного для этого не требуется).

--
Regards, LVT.


 
Alex_Korn ©   (2005-10-12 10:22) [7]

Leonid Troyanovsky ©   (12.10.05 9:43) [6]
Меня интересует как далеко я нахожусь от такой
загрузки стека, когда наступит "Stack overload".


 
Digitman ©   (2005-10-12 11:04) [8]


> Alex_Korn ©   (12.10.05 10:22) [7]


Любопытно, как ты вознамерился оценивать это самое "как далеко" ...

т.е. любопытно то самое условие выхода из рекурсивного цикла на случай "близости конца", которое ты предполагаешь ввести у себя в алгоритме ...


 
Alex_Korn ©   (2005-10-12 11:28) [9]

Digitman ©   (12.10.05 11:04) [8]
Допустим получаю, что занял 90% от "Stack overload"
и останавливаю рекурсию, допустим глобальной переменной или
напрямую, перед рекурсивным вызовом запрашиваю свое местонахождение.


 
Digitman ©   (2005-10-12 11:41) [10]


> Допустим получаю, что занял 90% от "Stack overload"
> и останавливаю рекурсию


А с чего ты взял, что очередная итерация рекурсивного цикла уже не уместится в оставшиеся 10% стека и поэтому пора выходить из рек.цикла ?

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

К тому же стек не имеет фикссированного (на всем протяжении работы программы) размера - в ходе работы процесса он может по необходимости расти в пределах от min  до max


 
MBo ©   (2005-10-12 12:47) [11]

>Alex_Korn
Зря ты не хочешь подробности задачи раскрыть.
Не исключено, что найдется более эффективное решение.


 
Alex_Korn ©   (2005-10-12 14:13) [12]

Подробности ничего не дадут, тут весь проект приводить надо:((
function ModuleWorkStepRec(Module:TModule; Laser:TLaserMarker; var OldCardNum:string; var Step:integer; Slots:TStringList):Boolean;
var
Err:TError;
MarkErr:Boolean;
ErrArr: array[0..4] of TError;
CardNum,ICCID,PIN1,PIN2,PUK1,PUK2:string;
begin
Result:=False;
MarkErr:=False;
inc(Step);
SendFrameText(Module.ModuleNumb,PChar("Идет подача карты"));
if not Module.FeedCards(False,ErrArr) then
 begin
  if ErrArr[0].ErrCode>0 then ErrArr[0].ErrCode:=erFatalError;
  IsContinue:=ErrCodeReaction(ErrArr[0],"FeedCards","Карта не поступила в конвейер");
 end;

SendFrameText(Module.ModuleNumb,PChar("Идет маркировка карты"));
Err:=Laser.Mark(Slots);
Slots.Clear;
if Err.ErrCode>0 then
 begin
  MarkErr:=True;
  Err.ErrCode:=erMediumError;
  ErrCodeReaction(Err,"Laser.Mark",OldCardNum,"Ошибка маркировки карты");
 end;

if not IsLastCard(OldCardNum) then
 begin
  SendFrameText(Module.ModuleNumb,PChar("Идет формирование слота."));
  if SetResult(CardNum,GetCardNumber(Module.Channels[ChnlInd]),"") then
   try
    ICCID:=GetValue(PChar(CardNum),"ICCID");
    PIN1:=GetValue(PChar(CardNum),"PIN1");
    PIN2:=GetValue(PChar(CardNum),"PIN2");
    PUK1:=GetValue(PChar(CardNum),"PUK1");
    PUK2:=GetValue(PChar(CardNum),"PUK2");
    if (ICCID="") or (PIN1="") or (PIN2="") or (PUK1="") or (PUK2="") then
     begin
      WriteMsg(LastError);
      SendFrameText(ModInd,PChar("Ошибка получения параметров из SlotFile"));
      SendFrameMess(ALX_FRAME_BASE,ModInd,ErrCodeToMess(erFatalError),integer(PChar(CreateDelimStr(["Шаг"+gapIs+IntToStr(Curr_ Step),"GetValue",ICCID,IntToStr(erFatalError),LastError,"Ошибка получения параметров из SlotFile"],Dlm))));
      IsContinue:=False;
     end
    else Result:=CreateSlotsList(ICCID,PIN1,PIN2,PUK1,PUK2,Slots);
    if not Result then
     begin
      Err.ErrCode:=erWarning;
      Err.ErrString:="Слот лист пуст";
      ErrCodeReaction(Err,"CreateSlotsList",ICCID,"Ошибка в формировании слота");
     end;
   finally
   end;
 end;

if not MarkErr then
 begin
  SendFrameText(Module.ModuleNumb,PChar("Ожидание конца маркировки карты."));
  Err:=Laser.WaitForMarkEnd;
  if Err.ErrCode>0 then Err.ErrCode:=erMediumError;
  ErrCodeReaction(Err,"WaitForMarkEnd",OldCardNum,"Ошибка окончания маркировки карты");
 end;

if Err.ErrCode=0 then SendFrameInfo(ModInd,PChar(CreateDelimStr(["Шаг"+gapIs+IntToStr(Curr_Step),"WaitForMarkEnd",OldCardNum,IntToStr(Err.ErrC ode),Err.ErrString,"Конец маркировки карты"],Dlm)));

SendFrameText(Module.ModuleNumb,PChar("Идет запись результата маркировки в БД."));
if not Write_ResultToDB(PChar(OldCardNum),Err.ErrCode,PChar(Err.ErrString)) then
 begin
  WriteMsg(LastError);
  SendFrameMess(ALX_FRAME_BASE,ModInd,MODULE_WRITE_DB_ERR,integer(PChar(CreateDelimStr(["Шаг"+gapIs+IntToStr(Curr_Step),"W riteResultToDB",OldCardNum,IntToStr(erFatalError),LastError,"Ошибка записи результата в БД"],Dlm))));
  Exit;
 end;

if IsLastCard(ICCID) then
 begin
  Result:=True;
  SendFrameText(Module.ModuleNumb,PChar("Процесс маркировки карт завершен."));
  SetFrameColor(ALX_FRAME_BASE,Module.ModuleNumb,MODULE_SET_COLOR,clLime);
  Exit;
 end;
if Result and IsContinue then ModuleWorkStepRec(Module,Laser,ICCID,Step,Slots);
end;


 
Digitman ©   (2005-10-12 14:23) [13]


> if Result and IsContinue then ModuleWorkStepRec(Module,Laser,
> ICCID,Step,Slots);


ну и какие там рассуждения о стеках, когда вот здесь


> if Result and IsContinue then ModuleWorkStepRec(Module,Laser,
> ICCID,Step,Slots);


явная ЛАЖА ?

с какого перепугу здесь п/программа ModuleWorkStepRec() вызывается как процедура, в то время как для рекурсии важен ее вызов как ФУНКЦИИ и столь же важен результат, ею возвращаемый ?!

давай исправляй уже лажу... потом и в рассуждалки про стек будем играть)


 
Leonid Troyanovsky ©   (2005-10-12 14:32) [14]


> Alex_Korn ©   (12.10.05 14:13) [12]
> Подробности ничего не дадут, тут весь проект приводить надо:
> ((
> function ModuleWorkStepRec(Module:TModule; Laser:TLaserMarker;
>  var OldCardNum:string; var Step:integer; Slots:TStringList):
> Boolean;


Вот я не понял, а чем while ModuleWorkStepRec() do ; не гоже?
Что, нельзя вычислить значения Slots для произвольного Step?

--
Regards, LVT


 
Digitman ©   (2005-10-12 14:38) [15]

короче, алгоритм - "фтопку".

после того как будет нормально продуманный рек.алгоритм будут и рассуждалки про стек.


 
Alex_Korn ©   (2005-10-12 15:02) [16]

Leonid Troyanovsky ©   (12.10.05 14:32) [14]
Нельзя
>Digitman
Процедура в процессе разработки.
Рассматриваются различные варианты, поэтому "лаж" в ней
предостаточно.


 
Alex_Korn ©   (2005-10-12 15:07) [17]

P.S. Сделал ее процедурой


 
Digitman ©   (2005-10-12 15:13) [18]

по крайней мере ЭТУ ( см. [13]) убери.

уж это лажа из лаж ... что там уж о стеке разглагольствовать ..


 
Alex_Korn ©   (2005-10-12 15:26) [19]

Digitman ©   (12.10.05 15:13) [18]
Убрал


 
Digitman ©   (2005-10-12 15:32) [20]

малацца.


 
Alex_Korn ©   (2005-10-12 16:19) [21]

Digitman ©   (12.10.05 15:32) [20]
С процедурой я разберусь.
Давайте лучше поговорим о стеке :))


 
Leonid Troyanovsky ©   (2005-10-12 17:08) [22]


> Alex_Korn ©   (12.10.05 15:02) [16]

> Нельзя


Бездоказательно.

--
Regards, LVT.


 
Alex_Korn ©   (2005-10-12 17:45) [23]

>Что, нельзя вычислить значения Slots для произвольного Step?
Карты в устройство подаются поочередно.
Не обраотав 36-ю, я не могу считать данные с 38-ой или 50-ой.
А Slots зависит от этих данных.


 
MBo ©   (2005-10-12 17:50) [24]

>Alex_Korn ©   (12.10.05 17:45) [23]
Это не противоречит обыкновенному циклу


 
Leonid Troyanovsky ©   (2005-10-12 17:58) [25]


> Alex_Korn ©   (12.10.05 17:45) [23]
> >Что, нельзя вычислить значения Slots для произвольного
> Step?

> Не обраотав 36-ю, я не могу считать данные с 38-ой или 50-
> ой.


Рекурсия была бы (почти) неизбежна  если б было наоборот, т.е.,
нельзя бы было обработать 36 без обработки 50-ой.
А так, у тебя, все равно, ведется список Slots, при необходимости
хранения всей предыстории можно задействовать и его Objects.

--
Regards, LVT.


 
Digitman ©   (2005-10-12 18:13) [26]


> Alex_Korn ©   (12.10.05 16:19) [21]
> Давайте лучше поговорим о стеке


а что о нем говорить ?

стек - он и в Африке стек.

ты вообще-то представляешь себе, как стек используется при рекурсии ?

да и не только при рекурсии - просто при обычном вызове п/программы с параметрами ? с учетом заданного соглашения о вызове ?



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.053 c
2-1132778916
vasek
2005-11-23 23:48
2005.12.11
не работает динамически созданный обработчик


6-1125579845
Autogen
2005-09-01 17:04
2005.12.11
RPC


14-1132528199
vasek
2005-11-21 02:09
2005.12.11
где взять доки по обьектам ядра (API), синхронизация


2-1132687021
Slaviq
2005-11-22 22:17
2005.12.11
Combobox.Items.AddObject( Текст , Текст )


3-1130236727
syte_ser78
2005-10-25 14:38
2005.12.11
Какой компонент правильно использывать?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский