Мой город.Форум Одесса Киев Харьков Днепроперовск Донецк » Компьютеры и интернет » Компьютеры Софт и игры » как правильно завершить программу delphi? чтобы не висала

Страниц (1): [1]
 

1. Den - 28 Сентября, 2011 - 17:25:26 - перейти к сообщению
есть проект с MDI окнами
.....
begin
Application.Initialize;


Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TClient, Client);
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm3, Form3);
..........
Application.CreateForm(TForm30, Form30);

PasswordDlg := TPasswordDlg.Create(PasswordDlg);

PasswordDlg.ShowModal;
PasswordDlg.Free;


Application.Run;
end.


при закрытии приложения перехватываю событие
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);

begin

case MessageDlg('Вы действительно хотите выйти?', mtWarning, mbYesNo, 0)
of
mrYes: begin
TrayIcon1.Visible := False;
unit6.Form6.DBGrid1.datasource.dataset.close;
unit1.Client.DBGrid1.datasource.dataset.close;
unit3.Form3.DBGrid1.datasource.dataset.close;
unit3.Form3.DBGrid2.datasource.dataset.close;
unit4.Form4.DBGrid1.datasource.dataset.close;

SQLConnection1.Connected := False;
Action:= caHide;

end;
mrCancel: Action:=caNone;
mrNo: Action:=caNone;
end;


приложение виснет примерно в 3х из десяти случаев выхода при этом на 100% используя ресурсы процессора - одного из его ядер, при трессировке виснет на строке end. в Program
Как избавится от этого и какие причины?
Дополнение #1 23.09.2011 20:00:49
я пробывал и Action := caFree;
и halt(0);
вместо Action:= caHide;
и Application.Terminate;
или Application.Destroy;
или Application.Free;

есе равно виснет в 20-30 % при выходе
Дополнение #2 24.09.2011 0:04:50
отладчике поставил breakpoint и прошелся пошагово- зависает на самой последней строчке всей программы
на строке end. в Program
2. Iriska - 28 Сентября, 2011 - 17:27:54 - перейти к сообщению
Для вопроса "закрывать или нет?" есть событие OnCloseQuery, специально для этого предназначенное. Чтобы найти причину зависания попробуй в отладчике поставить breakpoint и пройтись пошагово
3. Den - 28 Сентября, 2011 - 17:28:56 - перейти к сообщению
разместил procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
все равно виснет((((((((

в эвентлоге

при выходе
...
Thread Start: Thread ID: 1104. Process MDIAPP.exe (2128)
Thread Exit: Thread ID: 3076. Process MDIAPP.exe (2128)
Module Load: unidrvui.dll. No Debug Info. Base Address: $71990000. Process MDIAPP.exe (2128)
Module Load: MXDWDUI.dll. No Debug Info. Base Address: $736A0000. Process MDIAPP.exe (2128)
Module Load: mxdwdrv.dll. No Debug Info. Base Address: $72FD0000. Process MDIAPP.exe (2128)
Module Load: FONTSUB.dll. No Debug Info. Base Address: $74640000. Process MDIAPP.exe (2128)
Module Load: prntvpt.dll. No Debug Info. Base Address: $73680000. Process MDIAPP.exe (2128)
Thread Start: Thread ID: 996. Process MDIAPP.exe (2128)
Module Load: XmlLite.dll. No Debug Info. Base Address: $747C0000. Process MDIAPP.exe (2128)
Module Unload: XmlLite.dll. Process MDIAPP.exe (2128)
Thread Exit: Thread ID: 996. Process MDIAPP.exe (2128)
Source Breakpoint at $77CA64F4: D:\Новая папка\MDIAPP.dpr line 659. Process MDIAPP.exe (2128)
Thread Exit: Thread ID: 1152. Process MDIAPP.exe (2128)
Thread Exit: Thread ID: 564. Process MDIAPP.exe (2128)
Thread Exit: Thread ID: 2424. Process MDIAPP.exe (2128)
Thread Exit: Thread ID: 3636. Process MDIAPP.exe (2128)
Thread Exit: Thread ID: 2960. Process MDIAPP.exe (2128)
Thread Exit: Thread ID: 1556. Process MDIAPP.exe (2128)
Thread Exit: Thread ID: 1196. Process MDIAPP.exe (2128)
Thread Start: Thread ID: 2832. Process MDIAPP.exe (2128)
и последняя строчка повторяется с разным ид(((

точнее эта строчка повторяется Thread Exit: Thread ID: 1196. Process MDIAPP.exe (2128)
с разным ид

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

я даже пробывал сделать все окна обычными - не было дочерних, и приложение стало не MDI а SDI то есть обычное- и все равно так же иногда при выходе виснет, еще я заметил если проверять подтверждение выхода в TMainForm.FormCloseQuery даже чаще виснет чем если оно находится в TMainForm.FormClose, но пробывал вообще ничего при выходе ни TMainForm.FormClose ни TMainForm.FormCloseQuery не делать - все равно виснет((
Дополнение #7 25.09.2011 1:44:11
интерестное вставил во все формы в FormDestroy(Sender: TObject); Dialogs. showmessage(' уничтожаем форму номер 4 ...');
завержает после 30 нажатий ок - идеально
(Добавление)
сделал формирование лога в каждом дестрое
25.09.11 03:06:16.021 open PasswordDlg
25.09.11 03:06:20.050 ondestory PasswordDlg
25.09.11 03:06:23.070 ondestory Form30
25.09.11 03:06:23.072 ondestory Form28
25.09.11 03:06:23.074 ondestory Form27
25.09.11 03:06:23.077 ondestory Form26
25.09.11 03:06:23.079 ondestory Form25
25.09.11 03:06:23.080 ondestory Form24
25.09.11 03:06:23.082 ondestory Form23
25.09.11 03:06:23.083 ondestory Form22
25.09.11 03:06:23.084 ondestory Form21
25.09.11 03:06:23.085 ondestory Form20
25.09.11 03:06:23.144 ondestory Form19
25.09.11 03:06:23.146 ondestory Form18
25.09.11 03:06:23.147 ondestory Form17
25.09.11 03:06:23.609 ondestory Form16
25.09.11 03:06:23.611 ondestory Form15
25.09.11 03:06:23.612 ondestory Form14
25.09.11 03:06:23.613 ondestory Form13
25.09.11 03:06:23.615 ondestory Form12
25.09.11 03:06:23.616 ondestory Form10
25.09.11 03:06:23.618 ondestory Form9
25.09.11 03:06:23.620 ondestory Form8
25.09.11 03:06:23.622 ondestory Form7

вероятно проблема в 7 форме, в ней есть обработчик события onclose onhide - но они не настыпают при выходе, как узнать где в этой фоме может быть проблема, PS - - по умолчанию она скрытая, и не дочерняя - вызавается как модальная, НО эта форма при дестрое виснет даже если НИ РАЗУ не показывалась
4. Den - 25 Марта, 2012 - 14:21:31 - перейти к сообщению
самое что интересно именно из за использования RaveReport зависает, пробывавал в компонентах RvDataSetConnections разные свойства в true false менять - практически нет зависаний при выходе, но появились в 6ой форме одибки типа name: Preparation of default expression failed with eoс Access violation at address ........ Read of address ........`

попробівал вообще убрать всо обращения к компоненту RvSystem - ничего не помагла - но убрал вообще с формы RvSystem - ошибка при завершении исчезла- не знаю где же собака зарыта?)) что же неправильно?
5. Alena - 25 Марта, 2012 - 14:55:10 - перейти к сообщению
проверьте все настройки revereport если используете на форме, он весьма глюченный


[Script Execution time: 0.0224]     [ Gzipped ]



Hosting Ukraine