| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > Кнопка START и кнопка STOP |
| Автор: Alexzz 9.7.2008, 21:04 | ||
Предположим, есть форма и на ней две кнопки, одна старт, другая стоп. Вторая изначально не видна (.Visible выставлен в false). По нажатию первой кнопки начинается процесс чтения данных через ком-порт. На время выполнения кнопка старт становится неактивной, а вторая появляется.
Процесс заканчивается когда все данные считаны. Но может возникнуть ошибка при считывании, или устройство может оказаться не включенным к ком-порту, и при этом в алгоритме считывания данных предусмотрены повторные попытки считать данные увеличив интервалы. Но есть желание чтобы процесс можно было бы прервать в любой момент, кликнув на кнопку STOP, коей является Button2. Ну предположим, задав некую глобальную переменную типа boolean, могу выставить её в true в начале процесса и постоянно проверять в условии цикла, а по клику на буттон2 просто присвоить ей значение false. Проблема в том, что пока выполняется алгоритм чтения, кнопка2 хоть и выглядит активной, но кликай на неё сколько хочешь, это ни к чему не приводит пока процесс не выполнится до конца. Внутри цикла процесса чтения стоит application.processmessages, но толку никакого. Вопрос: Как сделать чтобы кнопка 2 была кликаемой во время выполнения процесса прописанного в онклике кнопки 1? |
| Автор: Данкинг 9.7.2008, 22:12 |
| Если данные читаются в цикле, то как-то так: завести глобальную переменную... По клику на кнопке "стоп" изменить её значение... В цикле же проверять значение этой переменной после каждой итерации... Если изменилось, то из цикла выходить... И не забываем про application.Processmessages. |
| Автор: Alexzz 9.7.2008, 22:58 |
| Данкинг, это всё уже есть, вопрос не об этом. Вопрос о том, как кнопку "стоп" сделать активной. |
| Автор: Данкинг 9.7.2008, 23:25 | ||
тоже есть?.. |
| Автор: THandle 10.7.2008, 05:34 | ||
Ну вот работающий пример:
А вообще мне кажется, что тут лучше отдельный поток сделать... |
| Автор: morpheyushka 10.7.2008, 11:07 |
и попробывать прикрутить Антифриз к нему. Должно все получиться! |
| Автор: Rennigth 10.7.2008, 11:32 |
Единственное правильное решение. ProcessMessages все-равно коряво работает, плюс не будет возмодности во время выполнения закрыть программу. Добавлено через 45 секунд Причем он сдесь? В индейцев вроде автор не грает... |
| Автор: Alexzz 13.7.2008, 23:15 | ||||
Наверное нынче в моде давать ответ не читая вопрос. Я ещё в первом сообщении написал, что процессмессаджес есть, выполняется внутри цикла. Кнопка стоп выглядит активной, но она мёртвая до окончания чтения. По поводу отдельного потока, можно поподробней, пожалуйста? |
| Автор: THandle 14.7.2008, 06:02 |
| Alexzz, по нажатию кнопки START создаешь отдельный поток, он читает данные. По нажатию кнопки STOP останавливаем этот поток. Подробнее о потоках тут: http://forum.vingrad.ru/forum/topic-60076.html |
| Автор: MetalFan 14.7.2008, 15:31 | ||
какой такой антифриз?! из индей? и при чем он тут? |
| Автор: Alexzz 20.7.2008, 16:24 |
| Вынужден просить прощения. Оказывается это я сам лоханулся и не обратил внимания, что в случае отсутствия поступающих данных программа выполняет совсем другой цикл, в котором то и не было никакого application.processmessages. Всунул его и в тот цикл ожидания данных, точнее прямо в процедуру чтения, туда где начисляется таймаут, и кнопка "стоп" ожила! |