Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.11.29;
Скачать: [xml.tar.bz2];

Вниз

"Убить" программу   Найти похожие ветки 

 
Franzy   (2009-10-13 14:07) [0]

Имеется прога, которая при нажатии на кнопку вызывает процедуру из DLL. Процедура что-то долго и нудно считает, периодически делает коллбэк, сообщая процент выполнения, который отображается в лэйбле на форме.

Нужно сделать так, чтобы при нажатии на "крестик" на форме программа прекращала расчет и закрывалась. Сейчас все нажатия на крестик, несмотря на Application.processmessages в коллбэке, игнорируются до тех пор, пока расчет не будет окончен. Т.е. убить прогу можно только через таскменеджер, что не есть кошерно. Как сделать так, чтобы прога сразу убивалась при нажатии на крестик?


 
Dennis I. Komarov ©   (2009-10-13 14:16) [1]

Поток?


 
Inovet ©   (2009-10-13 14:18) [2]

Уолбэк к тебе? Может в той ДЛЛ есть процедура Хавершить_расчёт? во время колбэк вызвать её.


 
Franzy   (2009-10-13 14:46) [3]

В потоке, насколько я понимаю, обычно устраивается цикл, выполняющийся, пока thread.terminated = false, а процедура terminate вроде бы только и делает, что присваивает этому свойству true. Так что это вряд ли поможет.

Процедуры аварийного завершения расчета в длл нет :(


 
Медвежонок Пятачок ©   (2009-10-13 14:59) [4]

В потоке, насколько я понимаю, обычно устраивается цикл, выполняющийся, пока thread.terminated = false, а процедура terminate вроде бы только и делает, что присваивает этому свойству true. Так что это вряд ли поможет.

Тебе про твой поток говорили.
в котором ты сам волен обрабатывать терминэйтед.


 
RWolf ©   (2009-10-13 15:00) [5]

ну, раз уж процедура все равно делает коллбэк, то почему бы ей заодно не проверять какой нибудь флажок, устанавливаемый программой при завершении?


 
palva ©   (2009-10-13 15:08) [6]

Поток можно убить API-функцией. Правда, при этом могут остаться неосвобожденные ресурсы, не записанные до конца файлы и т. д. Но раз уж альтернативой этому служит закрытие через таск менеджер, то неприятности с ресурсами, наверно, уже не важны.


 
Сергей М. ©   (2009-10-13 15:12) [7]


> Franzy   (13.10.09 14:07)  


Аварийно завершиться можно так:

в теле колбэк-обработчика :

Application.ProcessMessages;
if Application.Terminated then Halt(0)

Ну а если не аварийно, а штатно, то либо следует предусмотреть флажок прерывания расчета среди возвращаемых колбек-процедурой параметров либо сделать ф-цию запуска расчета асинхронной.


 
Franzy   (2009-10-13 15:46) [8]


> Application.ProcessMessages;if Application.Terminated then
> Halt(0)


Йес! Работает! Спасибо.
А при таком выходе (по халту) выполняются деструкторы объектов? Память освобождается?


 
Сергей М. ©   (2009-10-13 15:52) [9]


> по халту) выполняются деструкторы объектов?


Нет. На то он и аварийный.


> Память освобождается?


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


 
Franzy   (2009-10-13 15:57) [10]

А зачем тогда деструкторы придуманы? Вроде бы их цель - освобождение ресурсов. Я всегда честно в OnClose делал все дин. массивы =nil, плюс вызывал деструктоыр всех вручную созданных объектов... получается, зря? Раз и так ресурсы будут освобождены?


 
Сергей М. ©   (2009-10-13 16:36) [11]

Тебе ж говорят - Halt предназначен для быстрого завершения процесса приложения.


> получается, зря?


Нет, не зря.


 
имя   (2009-10-13 23:30) [12]

Удалено модератором



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.11.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.005 c
2-1255591239
Диман
2009-10-15 11:20
2009.11.29
Установка фокуса у компонента


15-1254496978
Германн
2009-10-02 19:22
2009.11.29
Название контакта датчика


1-1226863029
demon
2008-11-16 22:17
2009.11.29
Как инсталировать шрифт в систему?


2-1255597644
night_light
2009-10-15 13:07
2009.11.29
Resource TmyForm not Found


15-1254145778
Piter
2009-09-28 17:49
2009.11.29
Реализация принципов tag ов (ключевых слов)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский