Что нового

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

VladUs

Скриптер
Сообщения
621
Репутация
181
Почему, при большом количестве итеракций в цикле, не происходит приостановка потока (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
Репутация
375
Ожидание есть, просто выдача в консоль не успевает за наращиванием счетчика, и мы не замечаем остановки. Попробуй увеличить Sleep или заменить его на Beep
 

kaster

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

VladUs

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

А как тогда?

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

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

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
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
Репутация
181
Redline, благодарю, из второго примера все стало ясно.
Прсто я не понял, что имел ввиду Kaster, в плане неправельной организации скрипта...
 

kaster

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