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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.07.2012, 03:01   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
Печаль Списки. Свойства. Обьекты. оДин раз получить информацию для объекта.

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

Ситуация:
Моя программа в таймере перебирает процессы по опр. условиям и изменяет опред. свойства процессов(приоритет и affinity).

Есть условности, при которых этим процессам нужно вернуть старые значения.
Дилема: как опредлить что мне больше НЕ нужно получать старые значения из процесса.

Код:
Код:
    fOldPriority: Cardinal; // Only run-time
    fOldAffinity: Cardinal; // Only run-time
  public
    property OldPriority: Cardinal read fOldPriority write fOldPriority;
    property OldAffinity: Cardinal read fOldAffinity write fOldAffinity;
По умолчанию, при создании объкта, эти значения устанавливаются в:
Код:
const
  E_INVALID_CARDINAL                    = 999;
что явл. сигналом, что объект ещё не получал сведений о процессе.

Далее 2 функции присвоения:
Код:
function SetProcessAffinity(aPID: Cardinal; aAffinityStr: string;
  var aOldAffinity: Cardinal): boolean;
var
  hProc: THandle;
  aSysMask, aProcMask: DWORD_PTR;
begin
  Result := False;
  hProc := OpenProcess(PROCESS_ALL_ACCESS, False, aPID);
  try
    if hProc <> 0 then
    begin
      GetProcessAffinityMask(hProc, aProcMask, aSysMask);
      aOldAffinity := aProcMask;
      Result := SetProcessAffinityMask(hProc, StrToAffinity(aAffinityStr));
    end;
  finally
    CloseHandle(hProc);
  end;
end;

function SetProcessPriority(aPID, aPriority: Cardinal;
  var aOldPriority: Cardinal): boolean;
var
  pHandle: DWORD;
  aNew: Cardinal;
begin
  Result := False;
  if (aPriority = 0) then
    aPriority := NORMAL_PRIORITY_CLASS;
  aNew := aPriority;

  pHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_SET_INFORMATION or
    PROCESS_VM_OPERATION, False, aPID);
  try
    if pHandle <> 0 then
    begin
      aOldPriority := GetPriorityClass(pHandle);
      Result := SetPriorityClass(pHandle, aNew)
    end;
  finally
    CloseHandle(pHandle);
  end;
end;
Вот метод возврата:
Код:
procedure TTarget.RestoreDeafaults;
var
  sPath: string;
  iPID: Cardinal;
  vOldP: Cardinal;
begin
  if not(OldPriority = E_INVALID_CARDINAL) and
    not(OldAffinity = E_INVALID_CARDINAL) then
  begin
    if ProcessExists(name, sPath, iPID) then
    begin
      SetProcessAffinity2(iPID, OldAffinity);
      vOldP := OldPriority;
      SetProcessPriority(iPID, OldPriority, vOldP);
    end;
  end;
end;
цикл таймера:
Код:
                    if Items[iRule].Flag_ForcePriority then
                    begin

                      SetProcessPriority(aProcess[i],
                        GetPriorityVal(Items[iRule].ProcessPriority),
                        vOldPriority);
                      Items[iRule].Targets[iTarget].OldPriority := vOldPriority;
                    end;

                    if Items[iRule].Flag_ForceAffinity then
                    begin
                      SetProcessAffinity(aProcess[i],
                        Items[iRule].ProcessAffinity, vOLdAffinity);
                      Items[iRule].Targets[iTarget].OldAffinity := vOLdAffinity;
                    end;
В псевдо-коде:
Код:
Виток цикла: 0 для обьекта: 1
    Новое значение = 3
    Свойство объекта :=  Получили старое значение = 1
    Присвоили новое начение 1 => 3
Конец
Виток цикла: 1 для обьекта: 1
    Новое значение = 3
   <А вот тут, перезапись значения не должна присходить>
    Свойство объекта :=  Получили старое значение = 3  
    Присвоили новое начение 3 => 3
Конец
Виток цикла: 2 для обьекта: 1
    Новое значение = 3
    Свойство объекта :=  Получили старое значение = 3  
    Присвоили новое начение 3 => 3
Конец
© сам придумал в 3 часа ночи.



Ну как-то так..

Последний раз редактировалось Человек_Борща; 01.07.2012 в 03:08.
Человек_Борща вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Свойства объекта Valera Помощь студентам 3 22.04.2011 15:25
Получить массив из элементов, встречающихся в исходном массиве ровно один раз без повторений Shikarmo4000 Помощь студентам 0 25.05.2010 01:27
Свойства Объекта Font.......... Rebel123 Общие вопросы Delphi 13 14.08.2009 18:21
Как получить адрес свойства объекта? Lim Общие вопросы Delphi 3 30.11.2007 19:46
Свойства объекта KBak Win Api 5 15.08.2007 20:21