Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Зависание на function InitAllocator [D7, WinXP]


Remand ©   (2012-07-09 11:40:00) 

Сталкиваюсь с прошлогодней проблемой: зависает на
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;


sniknik   (2012-07-11 07:58:00) [1]

> Ни разу даже не привено определение 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;


Anatoly Podgoretsky   (2012-07-11 07:30:00) [2]

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


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

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


sniknik   (2012-07-10 16:31:00) [4]

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


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

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


sniknik   (2012-07-10 14:17:00) [6]

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


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

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

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


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

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:38:00) [9]

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


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


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

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

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

PPS.

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

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


sniknik   (2012-07-10 07:31:00) [11]

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


sniknik   (2012-07-10 07:24:00) [12]

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


sniknik   (2012-07-10 07:17:00) [13]

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

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


Remand   (2012-07-10 07:08:00) [14]


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

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

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

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


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


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

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


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

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо