![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| Alexzz |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 87 Регистрация: 9.4.2007 Где: Латвия Репутация: 1 Всего: 1 |
Предположим, есть форма и на ней две кнопки, одна старт, другая стоп. Вторая изначально не видна (.Visible выставлен в false). По нажатию первой кнопки начинается процесс чтения данных через ком-порт. На время выполнения кнопка старт становится неактивной, а вторая появляется.
Процесс заканчивается когда все данные считаны. Но может возникнуть ошибка при считывании, или устройство может оказаться не включенным к ком-порту, и при этом в алгоритме считывания данных предусмотрены повторные попытки считать данные увеличив интервалы. Но есть желание чтобы процесс можно было бы прервать в любой момент, кликнув на кнопку STOP, коей является Button2. Ну предположим, задав некую глобальную переменную типа boolean, могу выставить её в true в начале процесса и постоянно проверять в условии цикла, а по клику на буттон2 просто присвоить ей значение false. Проблема в том, что пока выполняется алгоритм чтения, кнопка2 хоть и выглядит активной, но кликай на неё сколько хочешь, это ни к чему не приводит пока процесс не выполнится до конца. Внутри цикла процесса чтения стоит application.processmessages, но толку никакого. Вопрос: Как сделать чтобы кнопка 2 была кликаемой во время выполнения процесса прописанного в онклике кнопки 1? |
|||
|
||||
| Данкинг |
|
|||
![]() Yersinia pestis ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 8302 Регистрация: 7.11.2006 Где: მოსკოვი Репутация: 11 Всего: 130 |
Если данные читаются в цикле, то как-то так: завести глобальную переменную... По клику на кнопке "стоп" изменить её значение... В цикле же проверять значение этой переменной после каждой итерации... Если изменилось, то из цикла выходить... И не забываем про application.Processmessages.
-------------------- There's nothing left but silent epitaphs. |
|||
|
||||
| Alexzz |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 87 Регистрация: 9.4.2007 Где: Латвия Репутация: 1 Всего: 1 |
Данкинг, это всё уже есть, вопрос не об этом. Вопрос о том, как кнопку "стоп" сделать активной.
|
|||
|
||||
| Данкинг |
|
|||
![]() Yersinia pestis ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 8302 Регистрация: 7.11.2006 Где: მოსკოვი Репутация: 11 Всего: 130 |
-------------------- There's nothing left but silent epitaphs. |
|||
|
||||
| THandle |
|
|||
![]() Хранитель Клуба Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 50 Всего: 372 |
Ну вот работающий пример:
А вообще мне кажется, что тут лучше отдельный поток сделать... |
|||
|
||||
| morpheyushka |
|
|||
![]() Зеленый человек ![]() ![]() Профиль Группа: Участник Сообщений: 563 Регистрация: 26.2.2008 Где: Киев Репутация: 2 Всего: 8 |
и попробывать прикрутить Антифриз к нему. Должно все получиться! |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 15 Всего: 76 |
Единственное правильное решение. ProcessMessages все-равно коряво работает, плюс не будет возмодности во время выполнения закрыть программу. Добавлено через 45 секунд Причем он сдесь? В индейцев вроде автор не грает... -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| Alexzz |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 87 Регистрация: 9.4.2007 Где: Латвия Репутация: 1 Всего: 1 |
Наверное нынче в моде давать ответ не читая вопрос. Я ещё в первом сообщении написал, что процессмессаджес есть, выполняется внутри цикла. Кнопка стоп выглядит активной, но она мёртвая до окончания чтения. По поводу отдельного потока, можно поподробней, пожалуйста? |
||||
|
|||||
| THandle |
|
|||
![]() Хранитель Клуба Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 50 Всего: 372 |
Alexzz, по нажатию кнопки START создаешь отдельный поток, он читает данные. По нажатию кнопки STOP останавливаем этот поток.
Подробнее о потоках тут: http://forum.vingrad.ru/forum/topic-60076.html |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
какой такой антифриз?! из индей? и при чем он тут? -------------------- There are always someone smarter than you... |
|||
|
||||
| Alexzz |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 87 Регистрация: 9.4.2007 Где: Латвия Репутация: 1 Всего: 1 |
Вынужден просить прощения. Оказывается это я сам лоханулся и не обратил внимания, что в случае отсутствия поступающих данных программа выполняет совсем другой цикл, в котором то и не было никакого application.processmessages. Всунул его и в тот цикл ожидания данных, точнее прямо в процедуру чтения, туда где начисляется таймаут, и кнопка "стоп" ожила!
|
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |