![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Процесс не выгружается [D7, Win2k]
Belkova © (2005-06-30 20:14:00)Мастера Delphi! Посоветуйте, пожалуйста. Процесс при закрытии главной формы не выгружается. В диспечере задач смотрю: в приложениях ничего нет, а в процессах остается. Что делать?
3DxFantastika (2005-07-02 08:46:00) [1]"экстремальный" выход: ExitProcess(0);
The ExitProcess function ends a process and all its threads.
VOID ExitProcess(
UINT uExitCode // exit code for all threads
);
но не рекомендуется ..
КиТаЯц (2005-07-01 14:47:00) [2]Знаю, что ща народ ржать будет, но... вот реальный кусок из моей программы:
procedure TModule.DataModuleDestroy(Sender: TObject);
begin
null; // ХЗ зачем это надо, но ошибка при закрытии почему-то пропала
end;
(TModule = class(TDataModule), где, собственно все компоненты IBX и лежат)
Belkova (2005-07-01 14:27:00) [3]Перед перед CloseHandle разрывать соединение попробовала, не помогло.
Belkova (2005-07-01 14:23:00) [4]Пишет подключился.
evvcom (2005-07-01 14:15:00) [5]
> Belkova © (01.07.05 14:07) [29]
Ну а [19] пробовала? Что в логе? У тебя скорее всего проблема с коннектом, поэтому и [30] не поможет.
Stakan (2005-07-01 14:09:00) [6]Belkova © (01.07.05 13:54)
Попробуй как вариант принудительно разрывать соединение с базой в файле .dpr (перед CloseHandle)
Belkova (2005-07-01 14:07:00) [7]К сожалению не помогло.
Belkova (2005-07-01 13:54:00) [8]Спасибо, попробую.
evvcom (2005-07-01 13:52:00) [9]
> Faraday (01.07.05 13:46) [25]
Шаман, да и только. Чудеса какие-то рассказываешь.
Тогда уж по тексту, элегантнее писать:
CanClose := n = IDYES;
вместо всего этого наворота с проверкой булевой переменной и присвоения констант другой.
Faraday (2005-07-01 13:48:00) [10]Fl_Close:=true; - это я из своей проги скопировал - надо удалить.
Faraday (2005-07-01 13:46:00) [11]Попробуй после IBDataBase.Close поставить Sleep(1000).
Если не поможет - вставь в событие FormCloseQuery:
procedure TfmMainForma.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
var n:Integer;
begin
n:=MessageBox(Application.Handle,Pchar('Закончить работу с прогой ?'),PChar('Подтверждение'),MB_YESNO + MB_ICONQUESTION);
if n=IDYES then
begin
Fl_Close:=true;
CanClose:=True;
end
else
CanClose:=false;
end;
Как ни странно, но мне помогало.
evvcom (2005-07-01 13:07:00) [12]
> При закрытии делаю DBAlfa.Connected:=false;
> Незнаю, я лично сначала закрываю все таблицы а потом БД
destructor TDataSet.Destroy;
begin
Destroying;
Close;
...
destructor TCustomConnection.Destroy;
begin
inherited Destroy;
SetConnected(False);
...
Вывод: проблема не в этом.
Tor (2005-07-01 11:03:00) [13]Незнаю, я лично сначала закрываю все таблицы а потом БД. Щас найду и вышлю.
Belkova (2005-07-01 10:56:00) [14]Спасибо. Я поняла, но от примера не откажусь
belkova@alfacom.perm.ru
При закрытии делаю DBAlfa.Connected:=false;
Полагаю, что таблицы при этом тоже закроются.
Tor (2005-07-01 10:31:00) [15]Проверку пароля лучше производить в файле главной формы а не на кнопке ОК в форме вода пароля. Показыватьее как модальную возвращать mrOK и все это в цикле(в место рекурсии) там можно выводить сообщение о повторной попытке. Могу кинуть пример.
А при закрытии приложения ты закрываешь соединение с базой и всеми таблицами?
Belkova (2005-07-01 10:20:00) [16]По истечении приемлемого времени не выгружается. Понаблюдаю еще.
Обработчик напишу, посмотрю. Спасибо.
evvcom (2005-07-01 10:15:00) [17]В TIBDateBase есть обработчик AfterConnect. В нем и пишем WriteLnLog('Подключился'); тестируем и смотрим лог. Возможно на некоторых машинах существуют проблемы с подключением, поэтому и не выгружается сразу. Должно выгружаться по истечении какого-то более длительного времени.
Belkova (2005-07-01 09:54:00) [18]DBAlfa Это компонент IBDateBase.
evvcom (2005-07-01 09:49:00) [19]
> что такое fDM, fDir
Плюс к этому что такое DBAlfa?
evvcom (2005-07-01 09:47:00) [20]Попробуй типа:
try
WriteLnLog('Подключение...');
fDM.DBAlfa.Connected:=True ;
WriteLnLog('Подключился');
Естественно WriteLnLog надо реализовать самой. После закрытия и "невыгруза" посмотреть лог-файл.
Хотя скорее всего в логе будет 'Подключился'. Вероятно fDM.DBAlfa.Connected := True; запускает отдельный поток и в нем пытается асинхронно подключиться. В этих случаях в грамотно написанных компонентах предусматривают способы извещения основного потока об удаче/неудаче подключения, а также должны быть какие-нибудь свойства таймаута при соединении. Если есть такие события, то 'Подключился' или 'Не подключился' надо вынести туда.