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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2010, 19:33   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
Вопрос Аналог "Задать соответсвие.." в Диспетчере задач

Привет всем! Как такое реализовать?

Функция получения кол-ва доступных на ПК ядер процессора(Процессоров) есть.. а как такое реализовать?
Человек_Борща вне форума Ответить с цитированием
Старый 22.09.2010, 11:20   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Как получить что-то типа токого?:
Человек_Борща вне форума Ответить с цитированием
Старый 22.09.2010, 11:25   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

http://msdn.microsoft.com/en-us/libr...23(VS.85).aspx
вот как задать это соответствие(там битовая маска)
(можно для потока, но функция иная)
Get соответственно получить её.
http://msdn.microsoft.com/en-us/libr...81(VS.85).aspx
тут можно получить кол-во процессоров, и их доступность
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 22.09.2010 в 11:29.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.09.2010, 12:05   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Допустим кол-во процссоров я получаю вот так:
Код:
function TForm1.GetProcessorsCount: SmallInt;
var
  Sys: _SYSTEM_INFO;
begin
  GetSystemInfo(Sys);
  Result := Sys.dwNumberOfProcessors;
end;
По поводу доступности немного не понял, как понять "доступность процессора"?

Про SetAffinityMask я знаю..
но как допустим указать 3 и 4 cpu если в системе 2 ЦП по 2 Ядра на каждом?
как это делается в Диспетчере ? Думаю просто сложить маски это будет глупо.
Человек_Борща вне форума Ответить с цитированием
Старый 22.09.2010, 12:19   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
но как допустим указать 3 и 4 cpu если в системе 2 ЦП по 2 Ядра на каждом?
допустим
Код:
const 
  PN_0=$1;
  PN_1=$2;
  PN_2=$4;
  PN_3=$8;
  PN_4=$10;
  PN_5=$20;
  PN_6=$40;
  PN_7=$80;
  PN_8=$100;
  PN_9=$200;
  PN_10=$400;
  PN_11=$800;
  PN_12=$1000;
  PN_13=$2000;
  PN_14=$4000;
  PN_15=$8000;
  //думаю хватит.
  PN_ALL=$FFFFFFFF;
//ставим второй и третий процессор процессу
SetProcessAffinityMask(h,PN_2 or PN_3);
Цитата:
По поводу доступности немного не понял, как понять "доступность процессора"?
система может запретить использовать процессор.(согласись глупо давать тогда возможность его выбрать)
Цитата:
Думаю просто сложить маски это будет глупо.
бинарное сложение(or)
и ничего глупого, это и есть бинарная маска.

ЗЫ, мои константы подходят к любым из функций с бинарными масками процессоров(в том числе их маска доступности)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.09.2010, 15:06   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Осталось понять как сделать эмм к примеру если есть 32 чекбокса и при 4-ёх процессорах, будет активны только 4 чекбокса из 32
Человек_Борща вне форума Ответить с цитированием
Старый 22.09.2010, 16:09   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
if (Sys.dwActiveProcessorMask and PN_1)<>0 then //есть процессор с номером один
и тд.
(процессор с номером ноль есть всегда)
в принципе лучше всего сначало проверять кол-во процессоров, если больше одного то уже показать пункт выбора процев.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.09.2010, 16:35   #8
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Брр, некрасиво

Код:
CheckboxN.Checked := longbool(dwActiveProcessorMask shr N and 1); //N = 0..31
пыщь
JTG вне форума Ответить с цитированием
Старый 22.09.2010, 18:02   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию Благодарю=)

Спасибо , обоим ставлю ПЛЮС!

Вот что получилось(см. аттач).

только смущает вот это:
Код:
//приходиться сначало всем выставлять enabled false
CheckListBox1.ItemEnabled[i]:=False; // <<--конкретно это
CheckListBox1.Checked[i]:=longbool(Sys.dwActiveProcessorMask shr i and 1);
//тут опять возвращать... 
CheckListBox1.ItemEnabled[i]:=longbool(Sys.dwActiveProcessorMask shr i and 1);
и снова проблема=)
Как асоцировоть константы с выбранными чекбоксами?
вот константы:
Код:
  CPU_1=$1;
  CPU_2=$2;
  CPU_3=$4;
  CPU_4=$8;
  CPU_5=$10;
  CPU_6=$20;
  CPU_7=$40;
  CPU_8=$80;
  CPU_9=$100;
  CPU_10=$200;
  CPU_11=$400;
  CPU_12=$800;
  CPU_13=$1000;
  CPU_14=$2000;
  CPU_15=$4000;
  CPU_16=$8000;
  CPU_17=$10000;
  CPU_18=$20000;
  CPU_19=$40000;
  CPU_20=$80000;
  CPU_21=$100000;
  CPU_22=$200000;
  CPU_23=$400000;
  CPU_24=$800000;
  CPU_25=$1000000;
  CPU_26=$2000000;
  CPU_27=$4000000;
  CPU_28=$8000000;
  CPU_29=$10000000;
  CPU_30=$20000000;
  CPU_31=$40000000;
  CPU_ALL=$FFFFFFFF;
кстати правельно ли составлены константы?
Если я правельно понял то от 1 до 4 все множится на 2 , потом далее к тому что есть приписывается по 0?
Вложения
Тип файла: zip ololo.zip (2.1 Кб, 15 просмотров)

Последний раз редактировалось Человек_Борща; 22.09.2010 в 18:43.
Человек_Борща вне форума Ответить с цитированием
Старый 22.09.2010, 21:25   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в вашем списке должно быть 32 элемента.
тогда выходит так:
CL:TCheckBoxList;
id//это PID нашего процесса.
делаем так.
Код:
var i:integer;
p,s:DWORD;
h:THandle;
begin
h:=OpenProcess(id,false,PROCESS_QUERY_INFORMATION);//проверку стоит добавить
GetProcessAffinityMask(h,p,s);
CloseHandle(h);
for i:=0 to 31 do CL.ItemEnabled[i]:=longbool((s shr i) and 1);
for i:=0 to 31 do CL.Checked[i]:=longbool((p shr i) and 1);//я так думаю тебе нужно всетаки чекать именно те процессоры что разрешены процессу, а не доступные)
примерно так

кстати, в вашем коде одного процессора не хватает.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 22.09.2010 в 21:29.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать программу невидимой в диспетчере задач?? Дима я Общие вопросы Delphi 7 04.11.2010 10:12
Не отображаются имена потзователей в диспетчере задач Altera Windows 1 24.10.2009 14:46
В диспетчере задач ставлю средний приоритет, закрываю диспетчер. запускаю там снова низкий, что делать? Tranexxx Свободное общение 9 23.08.2009 11:12
Как сделать, чтобы процес небыло видно в Диспетчере задач? HunterMan Win Api 1 25.06.2008 21:34
Показывать ранг процесса в Диспетчере Задач как системный BanDit Win Api 1 30.07.2007 15:02