"Светофор"

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

"Светофор"

Сообщение A.A.Z. » 13.08.2003 (Ср) 17:04

Я тут на днях решил сделать маленькую прогу - "Светофор". Там будет картинка светофора, которая при нажатии кнопки должна менять цвета (они у меня все есть), выдерживая паузы, идентичные натуральным (для этого использовал функцию Sleep). В пошаговом режиме всё идёт как надо, а вот в нормальном - ерунда какая-то. Помогите, пожалуйста! (Проект с картинками в zip'е.) :oops:
Нет меня больше

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.08.2003 (Чт) 7:49

  1. После каждой смены картинок ставь оператор DoEvents
  2. optional Попробуй переделать проект, используя ImageList :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Сообщение X-BOND » 14.08.2003 (Чт) 13:34

Если честно, я не понял, на фига там вообще картинки. Можно спокойно обойтись Shape и просто менять цвета. И прога меньше, и код компактней.

_NeoN_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 178
Зарегистрирован: 14.08.2003 (Чт) 9:48
Откуда: Новосибирск

Сообщение _NeoN_ » 14.08.2003 (Чт) 16:07

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

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 14.08.2003 (Чт) 17:47

GSerg писал(а):После каждой смены картинок ставь оператор DoEvents

Спасибо! Помогло! :!:
P.S. А что такое - DoEvents? :oops: :oops: :oops:
Нет меня больше

_NeoN_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 178
Зарегистрирован: 14.08.2003 (Чт) 9:48
Откуда: Новосибирск

Сообщение _NeoN_ » 14.08.2003 (Чт) 18:06

DoEvents передает на некоторое время управление системе.
Код: Выделить всё
for i = 0 to 1000000
    a=a+1
next i

тут пока не выполнится цикл 1000000 раз ничего не произойдет. а вот так
Код: Выделить всё
for i = 0 to 1000000
    a=a+1
    DoEvents
next i

так будут обрабатываться разные события, на кнопки на форме давить можно, короче обрабатываются все события... коряво как-то обьяснил но думаю все всё поняли =)

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 14.08.2003 (Чт) 18:28

2 _NeoN_:
Спасибо, вроде понял!
Я сначала думал, что дело в Sleep'е, и уже хотел Sleep'ы заменять циклами типа
Код: Выделить всё
For i = 1 To 2000000000: Next i
! :lol:
Нет меня больше

X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Сообщение X-BOND » 14.08.2003 (Чт) 18:43

A.A.Z. писал(а):2 _NeoN_:
Спасибо, вроде понял!
Я сначала думал, что дело в Sleep'е, и уже хотел Sleep'ы заменять циклами типа
Код: Выделить всё
For i = 1 To 2000000000: Next i
! :lol:

Самый большой недостаток этого метода, в том, что на разных машинах будет разная задержка во времени. К тому же использование ЦП подскочит до 100%

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 14.08.2003 (Чт) 18:49

X-BOND писал(а):
A.A.Z. писал(а):2 _NeoN_:
Спасибо, вроде понял!
Я сначала думал, что дело в Sleep'е, и уже хотел Sleep'ы заменять циклами типа
Код: Выделить всё
For i = 1 To 2000000000: Next i
! :lol:

Самый большой недостаток этого метода, в том, что на разных машинах будет разная задержка во времени. К тому же использование ЦП подскочит до 100%

Да я же не всерьёз! :!: :!: :!:
Хоть я и глубокий ламер, я уж не настолько тупой, чтобы этим паузу делать! :shock: :lol:

P.S. Представляю, сколько раз придётся в пошаговом режиме F8 жать... :shock: :lol:
Нет меня больше

boevik
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 23.07.2002 (Вт) 11:44
Откуда: Israel

Сообщение boevik » 14.08.2003 (Чт) 19:00

_NeoN_ писал(а):DoEvents передает на некоторое время управление системе.

Очень глубокое заблуждение.
DoEvents - позволяет программе обработать свою очередь сообщений.
А система (OS) и без DoEvents продолжает работать.

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 14.08.2003 (Чт) 19:11

_NeoN_ писал(а):DoEvents передает на некоторое время управление системе.
Код: Выделить всё
for i = 0 to 1000000
    a=a+1
next i

тут пока не выполнится цикл 1000000 раз ничего не произойдет. а вот так
Код: Выделить всё
for i = 0 to 1000000
    a=a+1
    DoEvents
next i

так будут обрабатываться разные события, на кнопки на форме давить можно, короче обрабатываются все события... коряво как-то обьяснил но думаю все всё поняли =)


boevik писал(а):
_NeoN_ писал(а):DoEvents передает на некоторое время управление системе.

Очень глубокое заблуждение.
DoEvents - позволяет программе обработать свою очередь сообщений.
А система (OS) и без DoEvents продолжает работать.


Лично я понял вот так: в стандарте (без DoEvents) ЦП тратит 99% на выполнение чего-то (в данном случае - цикла), и пока не закончит его, на экране ничего нового не покажет, а DoEvents какую-то часть ЦП оставляет на выполнение других действий - нажатий на кнопки и т. д.
Нет меня больше

Boris_BGB
Флудер-Энтузиаст
Флудер-Энтузиаст
 
Сообщения: 661
Зарегистрирован: 11.12.2002 (Ср) 11:41

Сообщение Boris_BGB » 14.08.2003 (Чт) 19:24

Вообще можно обойтись и без Shape с помощью графических методов! 8)

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 14.08.2003 (Чт) 19:37

Boris_BGB писал(а):Вообще можно обойтись и без Shape с помощью графических методов!

Ага! Можно вообще и писАть с их помощью, и рисовать, и раскрашивать (по одной точке)... :wink: :)
Нет меня больше

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 14.08.2003 (Чт) 20:04

A.A.Z. писал(а):
Boris_BGB писал(а):Вообще можно обойтись и без Shape с помощью графических методов!

Ага! Можно вообще и писАть с их помощью, и рисовать, и раскрашивать (по одной точке)... :wink: :)


Ну не зачем извращаться :)
Есть же примитивы ,Line, Circle, Polygon :wink:
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 14.08.2003 (Чт) 20:07

Нет, ну, можно, конечно... Но всё же это - ИМХО, не самый лучший вариант. :wink:
Нет меня больше

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 14.08.2003 (Чт) 20:07

A.A.Z. писал(а):Лично я понял вот так: в стандарте (без DoEvents) ЦП тратит 99% на выполнение чего-то (в данном случае - цикла), и пока не закончит его, на экране ничего нового не покажет, а DoEvents какую-то часть ЦП оставляет на выполнение других действий - нажатий на кнопки и т. д.


Не правильно понимаешь :)
Представь себе человека на конвеере. Он постоянно делает одну и ту же операцию, не отвлекаясь ни на что. Вот так выглядит цикл без DoEvents. А если человек будет делать перерывы, на перекур, скажем, то он сможет поболтать с товарищами, етс...Это цикл с DoEvents...
Надеюсь объяснил :roll:
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 15.08.2003 (Пт) 9:58

Усиленно не соглашусь :) Пусть даже и упрощать, но не так же :)

Я бы объяснил так:
Допустим у тебя крутится (бес)конечный цикл. При этом программа не будет выполнять отрабатывать события (Click, KeyPress, MouseMove, перерисовка окон и прочие). Когда ты даешь команду DoEvents, то винда обрабатывает все события, которые накопились, но еще не отработаны.
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.08.2003 (Пт) 11:17

Э, а alibek-то Гуру! А я и не заметил! :shock:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 17.08.2003 (Вс) 10:58

2 alibek: Я подразумевал примерно то же, просто неправильно выразился! :wink:
Нет меня больше


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 3

    TopList