Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Потоки


Автор: RomanEEP 18.5.2006, 11:33
Каким образом можно указать потоку, на каком процессоре он должен выполняться? 

Автор: Демо 18.5.2006, 11:44
SetThreadAffinityMask 

Автор: RomanEEP 18.5.2006, 13:55
И еще, как узнать идентификатор главного потока программы? MainThreadID не идет - пишет неверный дескриптор. 

Автор: Демо 18.5.2006, 13:56
Цитата(RomanEEP @  18.5.2006,  13:55 Найти цитируемый пост)
И еще, как узнать идентификатор главного потока программы? MainThreadID не идет - пишет неверный дескриптор. 


Своей или чужой? 

Автор: RomanEEP 18.5.2006, 13:58
Своей 

Автор: Демо 18.5.2006, 14:06
У меня возвращает правильное значение 
Код

showmessage(inttostr(MainThreadId)+'/'+inttostr(GetCurrentThreadId));
 

Автор: RomanEEP 18.5.2006, 14:15
Но у меня при указании 
Код

SetThreadAffinityMask(MainThreadID, 1)

Вылетает с "неверный дескриптор"

Может быть из-за этого:
 This handle must have the THREAD_SET_INFORMATION access right associated with it.

Только как это установить? 

Автор: Демо 18.5.2006, 15:05
SetThreadAffinityMask(GetCurrentThread, 1) - для текущего потока

Для другого потока:

Код

const
  THREAD_TERMINATE            = ($0001);
  {$EXTERNALSYM THREAD_TERMINATE}
  THREAD_SUSPEND_RESUME       = ($0002);
  {$EXTERNALSYM THREAD_SUSPEND_RESUME}
  THREAD_GET_CONTEXT          = ($0008);
  {$EXTERNALSYM THREAD_GET_CONTEXT}
  THREAD_SET_CONTEXT          = ($0010);
  {$EXTERNALSYM THREAD_SET_CONTEXT}
  THREAD_SET_INFORMATION      = ($0020);
  {$EXTERNALSYM THREAD_SET_INFORMATION}
  THREAD_QUERY_INFORMATION    = ($0040);
  {$EXTERNALSYM THREAD_QUERY_INFORMATION}
  THREAD_SET_THREAD_TOKEN     = ($0080);
  {$EXTERNALSYM THREAD_SET_THREAD_TOKEN}
  THREAD_IMPERSONATE          = ($0100);
  {$EXTERNALSYM THREAD_IMPERSONATE}
  THREAD_DIRECT_IMPERSONATION = ($0200);
  {$EXTERNALSYM THREAD_DIRECT_IMPERSONATION}


  THREAD_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $3FF);
  {$EXTERNALSYM THREAD_ALL_ACCESS}


  SYNCHRONIZE              = ($00100000);
  {$EXTERNALSYM SYNCHRONIZE}
  
var
  H: THandle;
begin
  H := OpenThread(THREAD_ALL_ACCESS,False,ThreadId);
  if SetThreadAffinityMask(H,1)=0 then ShowMessage(SysErrorMessage(GetLastError));
  if H<>0 then CloseHandle(H);

  

Автор: Rouse_ 18.5.2006, 15:10
Цитата(RomanEEP @  18.5.2006,  15:15 Найти цитируемый пост)
Только как это установить?  

Изучай: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/thread_security_and_access_rights.asp 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)