![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Зависание на 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]> в интернете пишут
Тебе личнопишут ?