Что нового

[Процессы] Задержка времени, или Многозадачность

lazarxxx

Новичок
Сообщения
53
Репутация
2
Я не знаю как правильно назвать эту тему!!! Поправьте если не так
Суть проблемы такая. Надо чтобы внутренний цыкал выполнялся допустим ровно через 100 миллисекунд , но при этом никак не влиял на работу остального процесса.
Или так чтобы работало два (или н) процесса вместе, но можно было распределять нагрузку процессора на них по разному.
Пример
Код:
AutoIt
$s=1
While 1
if $s=1 Then  
ConsoleWrite ("2" &@CR)  
Sleep (100)
EndIf
ConsoleWrite ("1" &@CR)
WEnd

По этому примеру выполнение работы будет выглядеть так 1 2 1 2 1 2
А надо чтоб 2 строго через 100 миллисекунд а 1 на сколько процессора хватит!!!
Коряво выразился, но по-моему понятно!
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Re: [Процессы] Задержка времени

AutoIt не может коректно работать с двумя потоками одновременно. Вся программа выполняется последовательно, строчка за строчкой, поэтому то что ты задумал сделать неполучится. Но есть один выход. Регистрируй функцию которая будет исполняться, прерывая основную программу через N-ый промежуток времени. Задать такую функцию можно через
Код:
AdlibRegister
. Только учти, что зарегистрированная таким образом функция должна быть выполнена максимально быстро и без блокировок. Поэтому крутить в ней второй бесконечный цикл неполучится.


Добавлено:
Сообщение автоматически объединено:

Код примерно такой
Код:
OnAutoItExitRegister("_clean")
AdlibRegister("_MyFunc",100) ;Регистрируем функцию которая будет выполняться каждые 100 мс
HotKeySet("{ESC}","_clean") ;Нажми ESC для выхода


While Sleep(50)
	ConsoleWrite("1")
WEnd

Func _MyFunc() ;Функция будет вызываться каждые 100 мс. Функция не может принимать параметры
	ConsoleWrite("2" & @LF)
EndFunc

Func _clean()
	AdlibUnRegister("_MyFunc")
	Exit
EndFunc
 
Автор
L

lazarxxx

Новичок
Сообщения
53
Репутация
2
Re: [Процессы] Задержка времени

Доброго всем времени. Большое спосибо!!! за пример. меньши возни!!! То што надо!
Но так как подсказок не было, решил помучится сам.
Вот что у меня получилось.
Код:
$2=1
$3=1
$hTimer = TimerInit() ; Запускает таймер и хранит дескриптор в переменной
While 1
 ;оснавная программа
$3=$3+1 
ConsoleWrite ("нашол"& $2 &"x"& $3 &@CR)
$iDiff = TimerDiff($hTimer)
If $iDiff>1000 Then; 1000 - определяет в милисикундах следующий проход!!!
  $hTimer = TimerInit()
  $2=$2+1
  ;ваша программа которая будет выполнятся рас в секунду
EndIf
WEnd

Я даже не ожидал таких хороших результатов. Привязка получилась именно по времени и сами операторы машину не тормозят!!!
 

running-frag

why me?
Сообщения
441
Репутация
60
По поводу AdlibRegister () имейте ввиду, что данная функция останавливает "главный" процесс скрипта, выполняет указанную функцию и после уже продолжает "главный" процесс с места остнавки.
 
Автор
L

lazarxxx

Новичок
Сообщения
53
Репутация
2
Да я это тоже заметил, поэтому в случаях где основную программу нельзя тормозить я использую свой вариант. Пользуясь задержкой, распределяю ресурсы компьютера на то, что важней. Этим мой вариант намного эффективней!
 
Верх