Текущий архив: 2006.08.27;
Скачать: CL | DM;
Вниз
Сенсация! Код initialization может не выполнятся! Найти похожие ветки
← →
MikProg © (2006-07-12 14:09) [40]
> И что же там "криминального" творится, по-твоему ?
Ничего. Просто никто не удосужился посмотреть код, а рассуждений...
← →
Суслик © (2006-07-12 14:13) [41]автору
ты бы все-таки указал в списке юнитов проекта (он, насколько я понял, у тебя один - никаких пакетов) все юниты, которые ты в том числе неявно используешь.
Насколько я понял такие юниты у тебя есть.
← →
Суслик © (2006-07-12 14:13) [42]автору
ты бы все-таки указал в списке юнитов проекта (он, насколько я понял, у тебя один - никаких пакетов) все юниты, которые ты в том числе неявно используешь.
Насколько я понял такие юниты у тебя есть.
← →
Суслик © (2006-07-12 14:13) [43]автору
ты бы все-таки указал в списке юнитов проекта (он, насколько я понял, у тебя один - никаких пакетов) все юниты, которые ты в том числе неявно используешь.
Насколько я понял такие юниты у тебя есть.
← →
StriderMan © (2006-07-12 14:15) [44]рекомендую обернуть код в INITIALIZATION в try..finally и в finally писать в лог. так достовернее будет.
← →
MikProg © (2006-07-12 14:20) [45]
> Насколько я понял такие юниты у тебя есть.
Придется, наверное, но не хочется (как не хочу и регистрировать классы где нибудь кроме initialization) - все они кандидаты на сборку в две-три библиотеки содержащие классы разных уровней иерархии.
← →
MikProg © (2006-07-12 14:23) [46]
> рекомендую обернуть код в INITIALIZATION в try..finally
> и в finally писать в лог. так достовернее будет.
Достоверней чем что? Типа глобальный ExceptionHandler рантайма еще не готов?
← →
StriderMan © (2006-07-12 14:25) [47]
> StriderMan © (12.07.06 14:15) [44]
> рекомендую обернуть код в INITIALIZATION в try..finally
> и в finally писать в лог. так достовернее будет.
а еще лучше такtry
...
except
//пишем ошибку
end;
// пишем что все ОК
← →
Сергей М. © (2006-07-12 14:36) [48]
> MikProg © (12.07.06 14:09) [40]
> никто не удосужился посмотреть
Поясни нам, валенкам, что мы должны были увидеть в этом коде такого, что хоть как-то намекало бы на суть твоей проблемы ..
← →
sniknik © (2006-07-12 14:40) [49]Игорь Шевченко © (12.07.06 13:53) [38]
> отсюда резонный вопрос - какая разница, указывать const или не указывать ?
для контроля "себя любимого". хотя честно не знал, что оптимизатор стал таким умным. всегда писал (и буду скорее всего ;).
← →
StriderMan © (2006-07-12 14:42) [50]
> Aplication.OnException, в нем ту же LogRecord() с выводом
> текста ошибки
> Достоверней чем что? Типа глобальный ExceptionHandler рантайма
> еще не готов?
initialization в модулях выполняется еще до Application.Initialize, а именно на первом begin в проекте. Поэтому если там произойдет исключение, никакой Application.OnException ничего не поймает.
ЗЫ: Только что испытал
← →
MikProg © (2006-07-12 14:44) [51]
> хоть как-то намекало бы на суть твоей проблемы ..
В ожидании полезных сведений я пока закомментировал RegisterClipboardFormat и жду вестей от клиента.
← →
Сергей М. © (2006-07-12 14:46) [52]
> MikProg © (12.07.06 14:44) [51]
Комментируй хоть самого господа бога? но я рекомендую вникнуть в RTTI.
← →
sniknik © (2006-07-12 14:50) [53]> В ожидании ...
не хочеш пока развеять сомнения и ответить, что же у тебя в LogFileName? привести код его определения, и сказать где это происходить.
← →
MikProg © (2006-07-12 14:51) [54]
> ЗЫ: Только что испытал
>
Напоминаю. Приложение не вызывает ошибок! А буде она произойдет вы об этом узнаете в любом случае или от обработчика в RTL дельфы или от винды (небезизвестный диалог "Приложение будет закрыто.")
← →
MikProg © (2006-07-12 14:52) [55]
> что же у тебя в LogFileName?
Блин.
function LogFileName: string;
var
s, s1: string;
begin
s:=ParamStr(0);
s1:=ExtractFileExt(s);
Result:=copy(s,1,length(s)-length(s1))+".log";
end;
← →
Сергей М. © (2006-07-12 14:54) [56]
> MikProg © (12.07.06 14:51) [54]
Ты с дуба упал ?)
С какого перепугу незарегистрированность некоего дельфийского класса вызовет "небезизвестный диалог "Приложение будет закрыто." ?)
← →
MikProg © (2006-07-12 14:55) [57]
> вникнуть в RTTI.
Ну-ну. Подскажите как в монолитном экзешнике создать две копии RTTI.
← →
MikProg © (2006-07-12 14:57) [58]
> С какого перепугу незарегистрированность
Почитай свои посты до полного понимания.
← →
StriderMan © (2006-07-12 15:01) [59]
> Блин.
> function LogFileName: string;
> var
> s, s1: string;
> begin
> s:=ParamStr(0);
> s1:=ExtractFileExt(s);
> Result:=copy(s,1,length(s)-length(s1))+".log";
> end;
каждый раз при записи в лог такие строковые вычисления??? жуть...
ЗЫ:Result:= ParamStr(0) + ".log";
← →
MikProg © (2006-07-12 15:04) [60]
> ЗЫ: Result:= ParamStr(0) + ".log";
вы оптимизирете отладочный код? В любом случае - спасибо, я попробую, но вряд ли это поможет. :)
← →
StriderMan © (2006-07-12 15:05) [61]
> каждый раз при записи в лог такие строковые вычисления??
> ? жуть...
даже дважды....
> procedure LogRecord(s: string);
> var
> f: Text;
> oems: array [0..4096] of Char;
> begin
> Assign(f,LogFileName);
> if not FileExists(LogFileName) then
> Rewrite(f)
> else
> Append(f);
> Writeln(f,DateTimeToStr(now)," : ",s);
> Close(f);
> end;
.. а Close надо бы в finally засунуть...
← →
Сергей М. © (2006-07-12 15:15) [62]
> MikProg © (12.07.06 14:55) [57]
>
>
> > вникнуть в RTTI.
>
> Ну-ну. Подскажите как в монолитном экзешнике создать две
> копии RTTI.
Нунукай в другом месте.
Каждая RTTI создается при инициализации каждой RTL.
← →
Игорь Шевченко © (2006-07-12 15:30) [63]MikProg © (12.07.06 14:44) [51]
Тут такой момент - проблема не у отвечающих, проблема у тебя.
← →
Мефисто (2006-07-12 19:04) [64]
> MikProg © (12.07.06 10:00) [13]
Присоеденяюсь к пердыдущим коллегам.
Семество блоков try... уже должно быть на уровне рефлексов
← →
MikProg © (2006-07-12 20:30) [65]
> Каждая RTTI создается при инициализации каждой RTL.
Пример для монолитного экзешника?
← →
MikProg © (2006-07-12 20:35) [66]
> Тут такой момент - проблема не у отвечающих, проблема у
> тебя.
Как это вы заметили. Если бы эта была проблема отвечающих они бы давали советы если не как устранить, то как локализовать проблему. А пока они (сорри народ ничего персонального) блещут эрудицией и не более.
← →
MikProg © (2006-07-12 20:45) [67]
> Семество блоков try... уже должно быть на уровне рефлексов
т.е. подразумевается, что дельфа может еще и маскировать ошибки?
а как же вот это
procedure _StartExe(InitTable: PackageInfo; Module: PLibModule);
begin
RaiseExceptionProc := @RaiseException;
RTLUnwindProc := @RTLUnwind;
{$ENDIF}
InitContext.InitTable := InitTable;
InitContext.InitCount := 0;
InitContext.Module := Module;
MainInstance := Module.Instance;
{$IFNDEF PC_MAPPED_EXCEPTIONS}
SetExceptionHandler;
{$ENDIF}
IsLibrary := False;
InitUnits;
end;
и
procedure SetExceptionHandler;
asm
XOR EDX,EDX { using [EDX] saves some space over [0] }
LEA EAX,[EBP-12]
MOV ECX,FS:[EDX] { ECX := head of chain }
MOV FS:[EDX],EAX { head of chain := @exRegRec }
MOV [EAX].TExcFrame.next,ECX
{$IFDEF PIC}
LEA EDX, [EBX]._ExceptionHandler
MOV [EAX].TExcFrame.desc, EDX
{$ELSE}
MOV [EAX].TExcFrame.desc,offset _ExceptionHandler
{$ENDIF}
MOV [EAX].TExcFrame.hEBP,EBP
{$IFDEF PIC}
MOV [EBX].InitContext.ExcFrame,EAX
{$ELSE}
MOV InitContext.ExcFrame,EAX
{$ENDIF}
end;
Т.е. try except уже есть вокруг всей программы. Просто обрабатка делегирована АПИ ОС
ну и далее
procedure InitUnits;
var
Count, I: Integer;
Table: PUnitEntryTable;
P: Pointer;
begin
if InitContext.InitTable = nil then
exit;
Count := InitContext.InitTable^.UnitCount;
I := 0;
Table := InitContext.InitTable^.UnitInfo;
{$IFDEF LINUX}
Inc(Cardinal(Table), InitContext.Module^.GOT);
{$ENDIF}
try
while I < Count do
begin
P := Table^[I].Init;
Inc(I);
InitContext.InitCount := I;
if Assigned(P) then
begin
{$IFDEF LINUX}
CallProc(P, InitContext.Module^.GOT);
{$ENDIF}
{$IFDEF MSWINDOWS}
TProc(P)();
{$ENDIF}
end;
end;
except
FinalizeUnits;
raise;
end;
end;
на этом все! Далее идет код initialization унитов
← →
Суслик © (2006-07-12 23:35) [68]ты все же попробуй, что я говорил. если будет ошибка, надо будет дальше разбираться :)
← →
Сергей М. © (2006-07-13 08:18) [69]
> MikProg © (12.07.06 20:30) [65]
> Пример для монолитного экзешника?
Причем здесь "монолитный экзешник" ?
У него своя RTL, обращаясь к ней ты регистрируешь класс в соответствующей RTTI. А где-то далее по ходу работы приложения ты, к примеру, пытаешься проверить, не зарегистрирован ли этот класс в другом модуле (в bpl или dll), который будучи собранным с иным значением опции линкера Build With Run-Time Packages пользует другой экз-р RTL и RTTI соответственно. Совершенно очевидно, что в такой ситуации GetClass вернет nil.
← →
MikProg © (2006-07-13 08:38) [70]
> Причем здесь "монолитный экзешник" ?
Давать советы не читая вопрос - моветон. Вы не находите?
← →
Сергей М. © (2006-07-13 08:50) [71]
> MikProg © (13.07.06 08:38) [70]
см.[13]
> ищу причины приводящие к указанному эффекту
Я как раз и привел одну из таких причин.
← →
atruhin © (2006-07-13 08:59) [72]> [49] sniknik © (12.07.06 14:40)
> > отсюда резонный вопрос - какая разница, указывать const
> или не указывать ?
> для контроля "себя любимого". хотя честно не знал, что оптимизатор
> стал таким умным
Помимо вышеперечисленного большая разница во времени выполнения. При передаче БЕЗ const и var для подсчета ссылок создается неявный:
try
finaly
dec(refcount);
end;
для теста можно измерить скорость выполнения(с const и без const):
function FirstByteLess (S1, S2 : string) : boolean;
begin
result := S1[1] < S2[1];
end;
← →
evvcom © (2006-07-13 09:44) [73]> [39] isasa © (12.07.06 14:08)
Передается ссылка, но делается копия в стеке. А это уже не "по ссылке".
> [47] StriderMan © (12.07.06 14:25)
> try
> ...
> except
> //пишем ошибку
> end;
> // пишем что все ОК
Тогда уж:try
...
// пишем что все ОК
except
//пишем ошибку
end;
2 MikProg: и все же Assign и Rewrite я в своих проектах использовал единожды, но в конце LogRecord после всех Write[ln] делал Flush. Даже если приложение "будет закрыто" без Close файла всё записанное в нем остается.
← →
REA (2006-07-13 10:09) [74]>RegisterClass[es], выполнившаяся без исключения, гарантирует регистрацию в конкретном экз-ре RTTI.
абсолютно да, но выполнялись они в секции инициализации которую компилятор (линкер, загрузчик bpl, или еще кто то) не вызвал.
Перенес в другую секцию инициализации другого модуля и заработало.
Если дискуссия не придет к какому то выводу и будет не лень сделаю тестовую программу.
← →
Сергей М. © (2006-07-13 10:20) [75]
> REA (13.07.06 10:09) [74]
> выполнялись они в секции инициализации которую компилятор
> .. не вызвал
А вот это по сей момент не факт, а лишь домыслы.
То что код секции иниц-ии не отметил себя в файле протокола, еще не говорит о невызове секции.
← →
Игорь Шевченко © (2006-07-13 10:30) [76]MikProg © (12.07.06 20:35) [66]
> Как это вы заметили. Если бы эта была проблема отвечающих
> они бы давали советы если не как устранить, то как локализовать
> проблему. А пока они (сорри народ ничего персонального)
> блещут эрудицией и не более.
http://www.ln.ua/~openxs/articles/smart-questions-ru.html
Читать наизусть.
← →
isasa © (2006-07-13 10:40) [77]evvcom © (13.07.06 09:44) [73]
Передается ссылка, но делается копия в стеке. А это уже не "по ссылке".
! Тогда как объяснить одинаковые адреса?
Юрий Зотов © (12.07.06 12:45) [33]
Или я чего-то непонимаю?
← →
REA (2006-07-13 11:03) [78]>А вот это по сей момент не факт, а лишь домыслы.
А я и не говорю, что это факт - это наблюдение и повод для проверки.
← →
MikProg © (2006-07-13 11:07) [79]
> Читать наизусть.
А можно "почитать наизусть" советы "как правильно давать ответы"? :)
← →
Игорь Шевченко © (2006-07-13 11:10) [80]MikProg © (13.07.06 11:07) [79]
Я еще раз обращаю твое внимание на то, что проблема у тебя, а не у отвечающих. И решать ее надо тебе, а не им :)
Страницы: 1 2 3 вся ветка
Текущий архив: 2006.08.27;
Скачать: CL | DM;
Память: 0.65 MB
Время: 0.051 c