Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Зависание на function InitAllocator   Найти похожие ветки 

 
Remand   (2012-07-09 11:40) [0]

Сталкиваюсь с прошлогодней проблемой: зависает на
for i:= low(smallTab^) to high(smallTab^) do
       smallTab[i] := nil;

в интернете пишут, что такое может появится после каких-то обновлений безопасности.

Функция из GETMEM.INC

function InitAllocator: Boolean;
// Initialize. No other calls legal before that.
var
 i: Integer;
 a: PFree;
begin
 try
   InitializeCriticalSection(heapLock);
   if IsMultiThread then EnterCriticalSection(heapLock);

   MakeEmpty(@spaceRoot);
   MakeEmpty(@decommittedRoot);
   MakeEmpty(@committedRoot);

   smallTab := LocalAlloc(LMEM_FIXED, sizeof(smallTab^));
   if smallTab <> nil then begin
     for i:= low(smallTab^) to high(smallTab^) do
       smallTab[i] := nil;

     a := @avail;
     a.next := a;
     a.prev := a;
     rover := a;

     initialized := True;
   end;
 finally
   if IsMultiThread then LeaveCriticalSection(heapLock);
 end;
 result := initialized;
end;


 
Сергей М. ©   (2012-07-09 19:52) [1]

> в интернете пишут

Тебе лично пишут ?


 
Германн ©   (2012-07-10 02:36) [2]


>
> Remand   (09.07.12 11:40)
>
> Сталкиваюсь с прошлогодней проблемой: зависает на
> for i:= low(smallTab^) to high(smallTab^) do
>        smallTab[i] := nil;

Давайте подождём ещё год. Может тогда всё будет понятнее!?


 
Remand   (2012-07-10 07:08) [3]


> Тебе лично пишут ?

не лично, у кого-то подобная проблема была, но ответа так никто и не дал.
> Давайте подождём ещё год. Может тогда всё будет понятнее!
> ?

в том году программаспустя месяц стала запускаться

А если по существу у кого-нибудь будут идеи что изменить/удалить (обновления)? и с чем связано это зависание?


 
sniknik ©   (2012-07-10 07:17) [4]

> и с чем связано это зависание?
на 99.8% с ошибкой в твоем коде. искать конечно приятнее там где светлее.

выделение памяти делается в любой программе, т.е. если бы зависело от системной библиотеки и безопасности то "висли" бы все программы написанные на дельфе (это как минимум, по максимуму вообще все. это  происходит?).


 
sniknik ©   (2012-07-10 07:24) [5]

http://www.delphimaster.net/view/15-1195213340/all


 
sniknik ©   (2012-07-10 07:31) [6]

+
менеджер памяти можно заменить на FastMM, заодно она и правильность выделения в проге отслеживает.
а может даже глюк "замажет" т.к. работает по другому.


 
Плохиш ©   (2012-07-10 10:44) [7]


> Сталкиваюсь с прошлогодней проблемой: зависает на
> for i:= low(smallTab^) to high(smallTab^) do
>        smallTab[i] := nil;
>

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

PS. Советую прочитать руководство программиста раздел о использовании встроенного отладчика

PPS.

> в том году программаспустя месяц стала запускаться

Может пора нанять программиста?


 
Remand   (2012-07-10 11:38) [8]

Дело в том что программа время от времени работала. Потом стала зависать,т.е. exe-ком я уже пользуюсь года 4. Только в последий год стала такая ерунда.


 
Remand   (2012-07-10 11:39) [9]

OriginalWordBreakProc := Pointer( SendMessage( DBMemo1.Handle,
                                    EM_GETWORDBREAKPROC, 0, 0 ) );
  {$IFDEF WIN32}
  NewWordBreakProc := @MyWordBreakProc;
  {$ELSE}
  NewWordBreakProc := MakeProcInstance( @MyWordBreakProc, hInstance );
  {$ENDIF}
  SendMessage( DBMemo1.Handle, EM_SETWORDBREAKPROC, 0,
               Longint( NewWordBreakProc ) );
AddFontResource(PChar(".\bg_files\item_files\typewriter_font.tpf"));

SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);

на последней строке виснет, если ее убрать то все нормально. Что не так?


 
Remand   (2012-07-10 11:44) [10]

т.е. здесь я загружаю свой шрифт и потом выгружаю
RemoveFontResource(PChar(".\bg_files\item_files\typewriter_font.tpf"));
SendMessage( DBMemo1.Handle, EM_SETWORDBREAKPROC, 0,
               Longint( @OriginalWordBreakProc ) );
  {$IFNDEF WIN32}
  FreeProcInstance( NewWordBreakProc );
  {$ENDIF}

P/S еще стала музыка/звуки в приложении заикаться/щелкать, как будто подвисает.


 
sniknik ©   (2012-07-10 14:17) [11]

> SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
> ... Что не так?
синхронный броадкаст? ... даже если так можно, это неправильно.


 
Remand   (2012-07-10 16:13) [12]

не подскажите, как надо?


 
sniknik ©   (2012-07-10 16:31) [13]

кто кроме тебя знает "как надо"? логика твоя, если хочешь/надо ждать результат то... но только тогда не жалуйся на задержку.
асинхронно/событие без ожидания делается через PostMessage.


 
Remand   (2012-07-10 18:52) [14]

Сменил на асинхронно. Работает нормально без задержек.


 
Anatoly Podgoretsky ©   (2012-07-11 07:30) [15]

Ни разу даже не привено определение smallTab
Видимо сильно хочет решить проблему


 
sniknik ©   (2012-07-11 07:58) [16]

> Ни разу даже не привено определение smallTab
это из стандартного GETMEM.INC, вряд ли ошибка там(хотя, код странный, ИМХО), но -  
const
 cAlign        = 4;
 cSmallSize    = 4*1024;

type
 PFree = ^TFree;
 TFree = packed record
   prev: PFree;
   next: PFree;
   size: Integer;
 end;

 TSmallTab    = array [sizeof(TFree) div cAlign .. cSmallSize div cAlign] of PFree;

VAR
 smallTab     : ^TSmallTab;



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

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.054 c
2-1343630882
vasa777
2012-07-30 10:48
2013.03.22
замена или переопределение процедуры


1-1298990310
rodionov_uv
2011-03-01 17:38
2013.03.22
Прокрутка на форме


15-1352865495
MonoLife
2012-11-14 07:58
2013.03.22
Диалоговое окно выбора папки в играх.


15-1347455469
Artem
2012-09-12 17:11
2013.03.22
Как включить отображение 3d визуализации?


2-1347623853
Ботаник
2012-09-14 15:57
2013.03.22
Приложение замораживается