powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как прервать цикл?
18 сообщений из 18, страница 1 из 1
Как прервать цикл?
    #33606043
DDT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

Есть форма, которая ожидает поступления данных с СОМ порта:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
hComPort =  FOPEN("\\.\\COM1")

IF hComPort < 0  
?
ENDIF

str_read =  ""
DO WHILE LEN(str_read) ==  0 
	READ EVENTS
	str_read =  SUBSTR(FREAD( hComPort, 10 ),  2 ,  8 )
	
	IF LEN(str_read) >  0 
		=FCLOSE( hComPort) 
	ENDIF
ENDDO

_VFP.Forms('form1').workerCardnumber.value = str_read
thisform.Release()

Цикл DO крутиться, пока в переменную str_read не попадут данные с СОМ порта. Я хочу сделать на форме кнопку Отмена для того, чтобы ею можно было остановить процесс ожидания данных и закрыть форму.


В событии Click кнопки Отмена пишу:
thisform.Release()

но это не помогает. Цикл все равно продолжает выполняться.

Есть идея применить флаг, при поднятии которого кнопкой Отмена цикл останавливается.

Но есть ли еще варианты решения?

Спасибо.
...
Рейтинг: 0 / 0
Как прервать цикл?
    #33606116
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
hComPort =  FOPEN("\\.\\COM1")

IF hComPort < 0  
?
ENDIF

str_read =  ""
DO WHILE LEN(str_read) ==  0  or thisform.lCansel
	READ EVENTS
	str_read =  SUBSTR(FREAD( hComPort, 10 ),  2 ,  8 )
	
	IF LEN(str_read) >  0 
		=FCLOSE( hComPort) 
	ENDIF
ENDDO

_VFP.Forms('form1').workerCardnumber.value = str_read
thisform.Release()



заведите у формы свойство lCansel поумолч= .f.
и по клику кнопки присваивайте = .t.
...
Рейтинг: 0 / 0
Как прервать цикл?
    #33606119
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и read events меня Ваш настораживает
...
Рейтинг: 0 / 0
Как прервать цикл?
    #33607059
DDT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex11100и read events меня Ваш настораживает

Без него не получается даже нажать на кнопку.
...
Рейтинг: 0 / 0
Как прервать цикл?
    #33607066
Кузнецов Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DDT alex11100и read events меня Ваш настораживает

Без него не получается даже нажать на кнопку.

Попробуйте вместо него DOEVENTS.
...
Рейтинг: 0 / 0
Как прервать цикл?
    #33607089
Кузнецов Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы использовал для выхода из цикла взведение флага. И выходил бы из цикла по команде EXIT. Примерно так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
flag=.F.
DO WHILE ...
    ...
   DOEVENTS
   IF flag=.T.
      EXIT
   ENDIF
ENDDO
А в методе Click у кнопки написать
Код: plaintext
1.
flag=.T.
Тут с областью видимости флага могут возникнуть проблемы. Но решения здесь известно какие.
----------------------------------------------
Кто в армии служил - тот в цирке не смеется.
...
Рейтинг: 0 / 0
Как прервать цикл?
    #33607158
DDT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex11100
заведите у формы свойство lCansel поумолч= .f.
и по клику кнопки присваивайте = .t.

Сделал вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
thisform.lContinue = .t.

hComPort =  FOPEN("\\.\\COM1")

IF hComPort < 0  
?
ENDIF

str_read =  ""
DO WHILE thisform.lContinue == .t.	
	str_read =  SUBSTR(FREAD( hComPort, 10 ),  2 ,  8 )
	
	IF LEN(str_read) >  0 
		thisform.lContinue = .f.
		=FCLOSE( hComPort) 
	ELSE
		READ EVENTS
	ENDIF
ENDDO

_VFP.Forms('form1').workerCardnumber.value = str_read
thisform.Release()

Как только попадает в цикл, так даже при lContinue = .f. из него (цикла) уже не выходит.

Может существует какой-нибудь аналог оператора break?
...
Рейтинг: 0 / 0
Как прервать цикл?
    #33607315
m.a.v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А в каком событии вызывается цикл если в событии формы то никакое нажатие кнопок е его не прекратит т.к. событие не будет закончено.

Может стоит воспользоваться таймером такие циклы должны исполнятся в другом потоке.
...
Рейтинг: 0 / 0
Как прервать цикл?
    #33607443
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну у Вас на read events останавливается

я как-то не понял зачем он там нужен

по на жатию кнопки еще сделайте clea event
...
Рейтинг: 0 / 0
Как прервать цикл?
    #33607543
Maltsev Max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока из цыкла не выйдешь, на на кнопку не нажмешь. Фокс однопоточная система.

Здесь только один выход -- таймер.
...
Рейтинг: 0 / 0
Как прервать цикл?
    #33607702
А зачем открывать Com порт таким образом, для этого существует компонент MSComm и в нём есть событие, которое срабатывает при приёме данных с порта. И не нужны никакие циклы и даже таймеры.
...
Рейтинг: 0 / 0
Как прервать цикл?
    #33607709
А зачем открывать Com порт таким образом, для этого существует компонент MSComm и в нём есть событие, которое срабатывает при приёме данных с порта. И не нужны никакие циклы и даже таймеры.
...
Рейтинг: 0 / 0
Как прервать цикл?
    #33607728
m.a.v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Владимир__А зачем открывать Com порт таким образом, для этого существует компонент MSComm и в нём есть событие, которое срабатывает при приёме данных с порта. И не нужны никакие циклы и даже таймеры.

Дело не в том как принимать данные из com порта, а как прервать цикл.
...
Рейтинг: 0 / 0
Как прервать цикл?
    #33607800
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторБез него не получается даже нажать на кнопку.

так отслживание событий
нужно включить после вызова формы

а не в цикле
...
Рейтинг: 0 / 0
Как прервать цикл?
    #33607964
m.a.v __Владимир__А зачем открывать Com порт таким образом, для этого существует компонент MSComm и в нём есть событие, которое срабатывает при приёме данных с порта. И не нужны никакие циклы и даже таймеры.

Дело не в том как принимать данные из com порта, а как прервать цикл.

Во первых не нужно делать бесконечных циклов.
Во вторых нужно использовать не READ EVENTS а DOEVENTS тогда кнопки будут нажиматься
...
Рейтинг: 0 / 0
Как прервать цикл?
    #33608006
И ещё как ведёт себя команда FREAD( hComPort,10) ?
Если она ждёт 10 байт из порта, то цикл и не продолжается.
Если она не ждёт этих 10-и байт а возвращает меньше, то какой смысл в команде str_read = SUBSTR(FREAD( hComPort,10), 2, 8)
...
Рейтинг: 0 / 0
Как прервать цикл?
    #33608380
DDT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Владимир__
Если она не ждёт этих 10-и байт а возвращает меньше, то какой смысл в команде str_read = SUBSTR(FREAD( hComPort,10), 2, 8)

Так, постараюсь резюмировать танные советы.

Задача заключается в том, чтобы получить из порта строчку длинной 10 символов, но нужна не вся строка, а лишь 8 символов.

Как видно из моего примера, опыта работы с Фоксом у меня не много, поэтому прошу пояснить в чем принципиальное отличие READ EVENTS от DOEVENTS.

P.S.
f1 уже смотрел, туда не посылайте :)
...
Рейтинг: 0 / 0
Как прервать цикл?
    #33608394
DDT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в приведенном выше примере заменил READ EVENTS на DOEVENTS:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
str_read =  ""
DO WHILE thisform.lContinue == .t.	
	str_read =  SUBSTR(FREAD( hComPort, 10 ),  2 ,  8 )
	
	IF LEN(str_read) >  0 
		thisform.lContinue = .f.
		=FCLOSE( hComPort) 
	ELSE
		DOEVENTS
	ENDIF
ENDDO

Помогло. Спасибо. Хочеться теперь понять почему помогло?
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как прервать цикл?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]