Что нового

Почему не происходит приостановка потока (Sleep())

VladUs

Скриптер
Сообщения
621
Репутация
180
Почему, при большом количестве итеракций в цикле, не происходит приостановка потока (sleep())
Например, имеется два цикла, выполняющих одно и тоже, разница лишь в количестве итеракций.
Код:
For $i = 0 To 10000
    
$i =+$i
ConsoleWrite($i  & @CRLf)

If $i = 5000 Then
ConsoleWrite("Ожидаем 3 сек" & @CRLf)
Sleep(3000)
EndIf
    
Next

и
Код:
For $i = 0 To 100000
    
$i =+$i
ConsoleWrite($i &  @CRLf)

If $i = 50000 Then
ConsoleWrite("Ожидаем 3 сек" & @CRLf)
Sleep(3000)
EndIf
    
Next


Так вот в первом цикле, программа приостанавливает действие, на указанное кол-во мс., в функции Sleep(), а во-втором цикле этого не происходит.
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
Ожидание есть, просто выдача в консоль не успевает за наращиванием счетчика, и мы не замечаем остановки. Попробуй увеличить Sleep или заменить его на Beep
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
VladUs
так циклы не организовываются. поставь вывод индикатора в консоль, и увидишь какие значения он принимает. во втором случае просто увидишь, что нужная ветка не активизируется
 
Автор
V

VladUs

Скриптер
Сообщения
621
Репутация
180
Kaster [?]
так циклы не организовываются
А как тогда?

Я беру счетчик, увеличиваю его на единицу, отображаю значение счетчика в консоле.
Если счетчик достигнет определенного значения, то приостановка потока на 3 сек., далее продолжаем цикл.

В первом же случае отрабатывается нормально.
Я буду рад, если Вы привидети пример правельной организации данного цикла.
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
VladUs
Ты так и не понял :smile:
Консоль просто не успевает принимать текст в таком темпе - скрипт уже закончился, а текст в нее еще печатается, вот для наглядности пример - посмотри когда вылезет MsgBox, и когда закончат мелькать цифры в консоли:
Код:
For $i = 0 To 100000

$i =+$i
ConsoleWrite($i &  @CRLf)

If $i = 50000 Then
ConsoleWrite("Ожидаем 3 сек" & @CRLf)
Sleep(3000)
EndIf

Next
MsgBox(0, 'End', 'Скрипт закончил свою работу!')


Чтобы этого избежать, можно выдавать в консоль раз в 100 циклов:
Код:
For $i = 0 To 100000

$i =+$i
If IsInt($i/100) Then ConsoleWrite($i &  @CRLf)

If $i = 50000 Then
	ConsoleWrite("Ожидаем 3 сек" & @CRLf)
	Sleep(3000)
EndIf

Next
MsgBox(0, 'End', 'Скрипт закончил свою работу!')
 
Автор
V

VladUs

Скриптер
Сообщения
621
Репутация
180
Redline, благодарю, из второго примера все стало ясно.
Прсто я не понял, что имел ввиду Kaster, в плане неправельной организации скрипта...
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
VladUs [?]
в плане неправельной организации скрипта...
я такое не говорил. я имел в виду именно цикл. счетчик внутри цикла не увиличивают, да еще и на само значение счетчика. что-то больно экзотическое
 
Верх