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

Вниз

Обработка Cancel   Найти похожие ветки 

 
Шурик_   (2005-12-02 11:24) [0]

Возник такой вопросик. Есть функция которая может работать достаточно долго. На экране работа отображается в виде окошка с прогресс баром и кнопкой Cancel. Собсно вопрос каким образом обработать нажатие Cancel. Есть два варианта пока:
1. Функция работает в дополнительном (неосновном) потоке и по нажатии грохнуть этот поток. Мне этот вариант както не очень нравится. Пока интуитивно.
2. В функции, который организован через do-while, поставить счетчик и чтобы он через определенное количество итераций делал что-то вроде CheckMessage, и при наличии Cancel прервать выполнение.

Хотелось бы услышать как еще это можно организовать, и как это сделать грамотнее. Всем спасибо.


 
Плохиш ©   (2005-12-02 11:55) [1]

2. CheckMessage --> Application.ProcessMessages


 
Винт   (2005-12-02 11:57) [2]

Первый вариант лучше. Что смущает в его использовании?


 
ANB ©   (2005-12-02 12:15) [3]


> Первый вариант лучше. Что смущает в его использовании?

Никакого смысла городить отдельный поток (и наступать на грабли синхронизации) нету.


> Шурик_   (02.12.05 11:24)

while (условие) do begin // Или for или любой другой цикл
Полезные действия
Application.ProcessMessages;
if (Нажата Cancel) then begin
 break;
end;
end;

Особенности - при этом пользователь сможет нажимать другие кнопки в приложении, следовательно, умудрится запустить эту функцию еще раз. Чтобы этого не было - надо блокировать те кнопки, которые нельзя нажимать, пока этот код работает.


 
Винт   (2005-12-02 12:19) [4]

>ANB ©   (02.12.05 12:15) [3]

> Никакого смысла городить отдельный поток (и наступать на
> грабли синхронизации) нету.


Для длительных вычислений использование Application.ProcessMessages приведет к значительному замедлению вычислений, что иногда - критично для задачи.
Кроме того, никаких граблей нет. Все делается просто.


 
ANB ©   (2005-12-02 12:21) [5]


> Винт   (02.12.05 12:19) [4]

В отдельном потоке - не факт, что быстрее.


 
Винт   (2005-12-02 12:22) [6]


> В отдельном потоке - не факт, что быстрее.


Однозначно(при условии использования Application.ProcessMessage, конечно)


 
Digitman ©   (2005-12-02 12:31) [7]


> Винт   (02.12.05 11:57) [2]


1-й вариант чреват мемликами.


> Шурик_   (02.12.05 11:24)  


2-й вариант концептуально правильней и корректней.

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


 
Винт   (2005-12-02 12:35) [8]


> Digitman ©   (02.12.05 12:31) [7]
>
> 1-й вариант чреват мемликами.


Ну все ведь от реализации зависит-)


 
Anatoly Podgoretsky ©   (2005-12-02 12:57) [9]

Если окно модальное, то никаких проблем в Application.ProcessMessages не возникнет, он для того и предназначен, чтобы обрабатывать события.
Если не модальный, то сразу возникает вопрос, а что же делать с сообщения, что плевать на них что ли.
И озабоченым по поводу скорости, на современныъ компьютерах можно делать до нескольких миллионов вызовов в секунду, время работы функции менее одной микросекунды. Видимо кто то путает скорость данной функции с обработкой собщений.

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


 
Шурик_   (2005-12-02 13:26) [10]

Почитал, посмотрел принял решение. В принципе одна итерация цикла занимает порядочно времени  по сравнению с проверкой сообщения на приход Cancel - события. Так что действительно нечего дурью маяться и сделать как говорил >ANB ©   (02.12.05 12:15) [3].

Thanks All


 
Digitman ©   (2005-12-02 13:38) [11]


> Винт   (02.12.05 12:35) [8]


да, разумеется

потому и "чреват" сабжем, но не обязательно приводит к сабжу



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

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

Наверх





Память: 0.47 MB
Время: 0.018 c
2-1134469891
Mozart
2005-12-13 13:31
2006.01.01
Socket ы


2-1134809830
Arazel
2005-12-17 11:57
2006.01.01
Иконки по ТИПУ


3-1131823923
dj0n
2005-11-12 22:32
2006.01.01
Подскажите пожалуйста, как содержимое таблици Paradox можно петен


2-1134150434
bg8
2005-12-09 20:47
2006.01.01
Опять serial порт...


2-1134576874
Змей
2005-12-14 19:14
2006.01.01
отлавливание sc_minimize





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский