Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Как прервать цикл?  [new]
DDT
Member

Откуда:
Сообщений: 173
Привет.

Есть форма, которая ожидает поступления данных с СОМ порта:
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()

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

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

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

Спасибо.
16 мар 06, 16:55    [2456798]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать цикл?  [new]
alex11100
Guest
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.
16 мар 06, 17:15    [2456946]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать цикл?  [new]
alex11100
Guest
и read events меня Ваш настораживает
16 мар 06, 17:17    [2456952]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать цикл?  [new]
DDT
Member

Откуда:
Сообщений: 173
alex11100
и read events меня Ваш настораживает


Без него не получается даже нажать на кнопку.
17 мар 06, 09:02    [2458461]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать цикл?  [new]
Кузнецов Игорь
Member

Откуда: Иваново
Сообщений: 143
DDT
alex11100
и read events меня Ваш настораживает


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


Попробуйте вместо него DOEVENTS.
17 мар 06, 09:10    [2458473]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать цикл?  [new]
Кузнецов Игорь
Member

Откуда: Иваново
Сообщений: 143
Я бы использовал для выхода из цикла взведение флага. И выходил бы из цикла по команде EXIT. Примерно так
flag=.F.
DO WHILE ...
    ...
   DOEVENTS
   IF flag=.T.
      EXIT
   ENDIF
ENDDO
А в методе Click у кнопки написать
flag=.T.
Тут с областью видимости флага могут возникнуть проблемы. Но решения здесь известно какие.
----------------------------------------------
Кто в армии служил - тот в цирке не смеется.
17 мар 06, 09:23    [2458511]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать цикл?  [new]
DDT
Member

Откуда:
Сообщений: 173
alex11100

заведите у формы свойство lCansel поумолч= .f.
и по клику кнопки присваивайте = .t.


Сделал вот так:
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?
17 мар 06, 09:54    [2458618]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать цикл?  [new]
m.a.v
Member

Откуда: Пермь
Сообщений: 44
А в каком событии вызывается цикл если в событии формы то никакое нажатие кнопок е его не прекратит т.к. событие не будет закончено.

Может стоит воспользоваться таймером такие циклы должны исполнятся в другом потоке.
17 мар 06, 10:40    [2458853]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать цикл?  [new]
alex11100
Guest
ну у Вас на read events останавливается

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

по на жатию кнопки еще сделайте clea event
17 мар 06, 11:14    [2459052]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать цикл?  [new]
Maltsev Max
Member

Откуда: Россия, Пермь
Сообщений: 352
Пока из цыкла не выйдешь, на на кнопку не нажмешь. Фокс однопоточная система.

Здесь только один выход -- таймер.
17 мар 06, 11:43    [2459232]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать цикл?  [new]
__Владимир__
Member

Откуда:
Сообщений: 34
А зачем открывать Com порт таким образом, для этого существует компонент MSComm и в нём есть событие, которое срабатывает при приёме данных с порта. И не нужны никакие циклы и даже таймеры.
17 мар 06, 12:29    [2459510]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать цикл?  [new]
__Владимир__
Member

Откуда:
Сообщений: 34
А зачем открывать Com порт таким образом, для этого существует компонент MSComm и в нём есть событие, которое срабатывает при приёме данных с порта. И не нужны никакие циклы и даже таймеры.
17 мар 06, 12:31    [2459519]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать цикл?  [new]
m.a.v
Member

Откуда: Пермь
Сообщений: 44
__Владимир__
А зачем открывать Com порт таким образом, для этого существует компонент MSComm и в нём есть событие, которое срабатывает при приёме данных с порта. И не нужны никакие циклы и даже таймеры.


Дело не в том как принимать данные из com порта, а как прервать цикл.
17 мар 06, 12:37    [2459549]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать цикл?  [new]
alex11100
Guest
автор
Без него не получается даже нажать на кнопку.


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

а не в цикле
17 мар 06, 12:53    [2459682]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать цикл?  [new]
__Владимир__
Member

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


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


Во первых не нужно делать бесконечных циклов.
Во вторых нужно использовать не READ EVENTS а DOEVENTS тогда кнопки будут нажиматься
17 мар 06, 13:27    [2459955]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать цикл?  [new]
__Владимир__
Member

Откуда:
Сообщений: 34
И ещё как ведёт себя команда FREAD( hComPort,10) ?
Если она ждёт 10 байт из порта, то цикл и не продолжается.
Если она не ждёт этих 10-и байт а возвращает меньше, то какой смысл в команде str_read = SUBSTR(FREAD( hComPort,10), 2, 8)
17 мар 06, 13:36    [2460032]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать цикл?  [new]
DDT
Member

Откуда:
Сообщений: 173
__Владимир__

Если она не ждёт этих 10-и байт а возвращает меньше, то какой смысл в команде str_read = SUBSTR(FREAD( hComPort,10), 2, 8)


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

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

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

P.S.
f1 уже смотрел, туда не посылайте :)
17 мар 06, 15:16    [2460725]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать цикл?  [new]
DDT
Member

Откуда:
Сообщений: 173
в приведенном выше примере заменил READ EVENTS на DOEVENTS:

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

Помогло. Спасибо. Хочеться теперь понять почему помогло?
17 мар 06, 15:18    [2460747]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить