Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.08.2015, 22:36   #1
ShevlyakoV
 
Регистрация: 05.12.2012
Сообщений: 6
По умолчанию Как определить что изначальное значение равное нулю изменилось и снова стало нулем

Доброго всем времени суток!

Уважаемые знатоки, пожалуйста, помогите разобраться и решить поставленную задачу:
- Имеется целое число, изначально являющееся нулевым, но которое может изменить свое значение на случайное. Случайное значение может быть больше нуля или меньше него, но это не важно. Самое главное, это определить что значение изменилось и вновь вернулось в исходное состояние, т.е. вернулось в ноль.

Мне надо определить что изначальное значение равное нулю изменилось и снова стало нулем.

К примеру, если изначальное значение равно нулю, программа ведет себя спокойно. Если значение изменилось и вновь вернулось в нулевое, то каким либо образом надо сигнализировать об этом.
ShevlyakoV вне форума Ответить с цитированием
Старый 24.08.2015, 22:53   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну только в таймере или потоке просматривать это значение в цикле.
Нет механизмов события на изменение переменной. Всякие отладочные точки прерывания, хардврные или за счет отлова исключения при обращении к заблокированной памяти не считаются. Мониторить конечно можно (Отладчики спокойно это умеют), но каких-то пользовательских общепринятых средств в нативных языках не предусмотрено.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.08.2015, 22:55   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Вот прям возьмет и само себя внезапно изменит?

Сделайте метод изменения числа (и заодно можно его сделать private полем) и изменяйте только через него. Ну и в нем определяйте что вам надо, генерируйте события и т.п.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 25.08.2015, 02:29   #4
ShevlyakoV
 
Регистрация: 05.12.2012
Сообщений: 6
По умолчанию

Хочу сразу извиниться что не указал примеры исходного кода для поставленной задачи. Постараюсь это сейчас исправить...
Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну только в таймере или потоке просматривать это значение в цикле. Нет механизмов события на изменение переменной.
Нет, события происходят не в таймере, а в теле цикла с постусловием, а целое число которое надо проверять, берется из функции, которая обращается к памяти другого приложения и считывает численное значение.
Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Вот прям возьмет и само себя внезапно изменит? Сделайте метод изменения числа (и заодно можно его сделать private полем) и изменяйте только через него. Ну и в нем определяйте что вам надо, генерируйте события и т.п.
В общем, все происходит вот так, на примере простого чтения:
Код:
function Value: Integer;
var
  Identifier, Handle: Cardinal;
  Bytes: DWORD;
  Value: Integer;
begin
  Result := 0;
  GetWindowThreadProcessId(GameScreen, @ProcessIdentifier);
  ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessIdentifier);
  ReadProcessMemory(ProcessHandle, Ptr($1FFB5A6), @Value, SizeOf(Value), BytesRead);
  if not (Value = 0) then
  begin
    Result := Value;
  end;
end;

procedure ExecutiveProcedure;
begin
  while (True) do
  begin
    WriteLn('Value: ' + IntToStr(Value));
  end;
end;
Из выше указанного примера видно что есть функция которая обращается к памяти другого приложения и считывает от туда некое числовое значение, а потом, выводит его как целое число в исполнительной процедуре.

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

Последний раз редактировалось ShevlyakoV; 25.08.2015 в 17:41.
ShevlyakoV вне форума Ответить с цитированием
Старый 25.08.2015, 05:50   #5
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Может не совсем правильно понял, но нельзя ли просто запоминать предыдущее значение переменной, и в случае если оно было не 0, а новое значение 0, тогда выполнять нужные Вам действия?
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 25.08.2015, 08:53   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Проверка будет проходить в теле цикла с постусловием, где надо определить что изначальное значение равное нулю изменилось и снова стало нулем, и каким нибудь образом сигнализировать каждый раз как оно вернется в ноль.
Ну закатай цикл в TThread, и пусть крутит свое считывание )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.08.2015, 17:40   #7
ShevlyakoV
 
Регистрация: 05.12.2012
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну закатай цикл в TThread, и пусть крутит свое считывание )
Честно говоря, я не совсем понял ход ваших мыслей...

Цитата:
Сообщение от Krasiosoft Посмотреть сообщение
Может не совсем правильно понял, но нельзя ли просто запоминать предыдущее значение переменной, и в случае если оно было не 0, а новое значение 0, тогда выполнять нужные Вам действия?
Возможно что вы правы! Действительно, такой вариант вполне неплохо сработал.

Вот реализованный мною пример программного кода:
Код:
// function Value: Integer;  //Напомню что начение для переменной Value берется из этой функции
 
var
  Previous, Difference: Integer;

procedure ExecutiveProcedure;
begin
  while (True) do
  begin
    Difference := Value - Previous;
    Previous := Value;
    if (Difference <> Previous) then
    begin
      if (Previous = 0) then
      begin
        Windows.Beep(2000, 10);
      end;
    end;
  end;
end;
Проверка проходит в теле цикла с постусловием, добавлены две переменные:
- 1-я для предыдущего значения;
- 2-я для текущего значения.
В случаи если текущее изначальное значение равно нулю, то нечего не происходит, но если значение изменилось и вновь стало равно предыдущему, в этом случаи прозвучит сигнальный звук из системного динамика.

Теперь, у меня только один вопрос:
- Всели правильно я сделал или есть более рациональный/лучший способ?

Последний раз редактировалось ShevlyakoV; 25.08.2015 в 17:43.
ShevlyakoV вне форума Ответить с цитированием
Старый 25.08.2015, 17:53   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну в том и была мысль Стилета, про поток (TThread) это только если вам надо не блокировать основной поток (например UI) этим циклом.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 25.08.2015, 17:53   #9
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от ShevlyakoV Посмотреть сообщение
Честно говоря, я не совсем понял
А у Вас этот код выполняется не в отдельном потоке?

Но тут может быть еще одна проблема. Считывание через ReadProcessMemory переменной не гарантирует, что мы сможем отследить все ее изменения, даже если такое считывание будет происходить в цикле без всяких задержек.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 25.08.2015, 18:02   #10
ShevlyakoV
 
Регистрация: 05.12.2012
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Ну в том и была мысль Стилета, про поток (TThread) это только если вам надо не блокировать основной поток (например UI) этим циклом.
Оу! Теперь, понял!

Цитата:
Сообщение от Krasiosoft Посмотреть сообщение
А у Вас этот код выполняется не в отдельном потоке? Но тут может быть еще одна проблема. Считывание через ReadProcessMemory переменной не гарантирует, что мы сможем отследить все ее изменения, даже если такое считывание будет происходить в цикле без всяких задержек.
На самом деле в теле цикла есть небольшая задержка, она равна 40 миллисекунд. Данного отрезка времени вполне хватает что бы цикл выполнялся не поглощая при этом все ресурсы системы и успевал обрабатывает функцию чтения. Просто, я забыл указать это в своих предыдущих сообщениях, за что и приношу свои извинения.
ShevlyakoV вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дана последовательность ненулевых целых чисел,оканчивающая нулем.Определить,сколько раз в этой последовательности меняеться знак.( Salomon9393 Помощь студентам 0 07.12.2012 18:59
javascript изменить значение переменной (пр:было 1234 стало 12341234) marianna14 Помощь студентам 2 27.03.2011 12:24
Страница стала намного длиннее что стало причиной? slawok HTML и CSS 7 20.05.2010 22:56
Ах, что-то с памятью моей стало (Delphi 7) alxd Помощь студентам 7 22.09.2009 13:15