Модератор: Модераторы
A thread affinity mask must be a subset of the process affinity mask for the containing process of a thread. A thread can only run on the processors its process can run on. Therefore, the thread affinity mask cannot specify a 1 bit for a processor when the process affinity mask specifies a 0 bit for that processor
program project1;
{$mode delphi}{$H+}
uses
Windows, Classes, SysUtils;
var
pm, sm : DWORD;
l : DWORD;
res : DWORD;
begin
GetProcessAffinityMask( GetCurrentProcess, pm, sm);
writeln('Process Id: ', GetCurrentProcessId );
writeln('Process Mask: ', IntToHex(pm, 8));
writeln('System Mask: ', IntToHex(sm, 8));
l:=1;
while (l<>0) and (l and pm = 0) do l:=l shl 1;
if l = 0 then begin
writeln('epic fail... no processors?');
Halt(1);
end;
res:=SetThreadAffinityMask( GetCurrentThread, l and pm); // Новая маска для потока AND маска для процесса
if res=0 then
writeln('Error! ', GetLastError)
else begin
writelN('Thread mask was: ', INtToHex(res,8));
writelN('Thread mask new: ', IntToHex(l, 8));
end;
end.
program project1;
{$mode delphi}{$H+}
uses
Windows, Classes, SysUtils;
var
pm, sm : DWORD;
l : DWORD;
res : DWORD;
begin
GetProcessAffinityMask( GetCurrentProcess, pm, sm);
writeln('Process Id: ', GetCurrentProcessId );
writeln('Process Mask: ', IntToHex(pm, 8));
writeln('System Mask: ', IntToHex(sm, 8));
writeln('First try:');
l:=1;
while (l<>0) and (l and pm = 0) do l:=l shl 1;
if l = 0 then begin
writeln('epic fail... no processors?');
Halt(1);
end;
res:=SetThreadAffinityMask( GetCurrentThread, l and pm); // Новая маска для потока AND маска для процесса
if res=0 then
writeln('Error! ', GetLastError)
else begin
writelN('Thread mask was: ', INtToHex(res,8));
writelN('Thread mask new: ', IntToHex(l, 8));
end;
writeln('Second try:');
l:=l shl 1;
while (l<>0) and (l and pm = 0) do l:=l shl 1;
if l = 0 then begin
writeln('no more processors to play :(');
Halt(1);
end;
res:=SetThreadAffinityMask( GetCurrentThread, l and pm);
if res=0 then
writeln('Error! ', GetLastError)
else begin
writelN('Thread mask was: ', INtToHex(res,8));
writelN('Thread mask new: ', IntToHex(l, 8));
end;
end.
CRobin писал(а):функция GetCurrentThread понимается как не объявлена
допустимCRobin писал(а):скалогрыз это нужно для корретной работы таймера при измерении малых отрезков времени.
CRobin писал(а):скалогрыз у меня кросплатформенное решение на основе RDTSC
Сейчас этот форум просматривают: svk12 и гости: 14