Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

NTQuerySystemInformation and Threads [D6, Win95/98, Win2k]


Страницы:   1 2

Tommy ©   (2004-04-14 14:23:00) 

Добрый день всем!
Может кто-нибудь знает почему NTQuerySystemInformation
во второстепенном потоке(thread) не дает никаких результатов?
(А на таймере работает прекрасно)


Digitman   (2004-04-15 11:55:00) [1]


> "packed" стереть забыл


да packed-то как раз стирать не следует)... речь идет о выравнивании адреса начала всейструктуры, а не о выравнивании каждого ее поля

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


Tommy   (2004-04-15 11:44:00) [2]

ой извините "packed" стереть забыл!


Tommy   (2004-04-15 11:42:00) [3]

:)
да это по спешке,руками писал без copy/paste :)
А помогло вот что...
{$ALIGN 4}
TSystem_Basic_Information = packed record  
  dwUnknown1: DWORD;  
  uKeMaximumIncrement: ULONG;  
  uPageSize: ULONG;  
  uMmNumberOfPhysicalPages: ULONG;  
  uMmLowestPhysicalPage: ULONG;  
  uMmHighestPhysicalPage: ULONG;  
  uAllocationGranularity: ULONG;  
  pLowestUserAddress: Pointer;  
  pMmHighestUserAddress: Pointer;  
  uKeActiveProcessors: ULONG;  
  bKeNumberProcessors: byte;  
  bUnknown2: byte;  
  wUnknown3: word;  
end;  

только вот не знаю,это надо отключить это потом то есть
добавить {$ALIGN OFF} или нет?
Видите что делается когда люди не знают директив! :)


Digitman   (2004-04-15 11:21:00) [4]


> как это делать?


теми же средствами того же отладчика, точно так же как ты получил значение статуса ... остановился на упомянутом брейкпойнте, открыл окно отладчика Evaluate/Modify и посмотрел, чему равно значение @SysBaseInfo .. оно должно быть кратным 4-ке

если это не так, ищи почему ..

да, ты кстати так и не ответил на совершенно резонный вопрос - с какого перепугу у тебе метод Execute вдруг стал функциональным, если абстрактный метод TThread.Execute, который ты якобы перекрыл в классе TCPUinf, всю жизнь был и должен быть процедурным ?


Tommy   (2004-04-15 11:03:00) [5]

>>и проверяй соблюдение тобой этого требования ?
как это делать? и если оно не выполнено то как исправить положение?


Digitman   (2004-04-15 11:01:00) [6]

что конкретно тебе не понятно ?


Tommy   (2004-04-15 10:43:00) [7]

если можно немножко поподробнее о том что мне надо сделать (извините за непросвешенность :) )
Заранее огромное спасибо!


Digitman   (2004-04-15 10:27:00) [8]

требование ф-ции - 4-байтное выравнивание адреса структуры TSystem_Basic_Information  

ставь брейкойнт на строчку

status := NtQuerySystemInformation(..)

и проверяй соблюдение тобой этого требования - адрес стр-ры SysBaseInfo д.б. кратен четырем


Digitman   (2004-04-15 10:21:00) [9]

//
// MessageId: STATUS_DATATYPE_MISALIGNMENT
//
// MessageText:
//
//  {EXCEPTION}
//  Alignment Fault
//  A datatype misalignment was detected in a load or store instruction.
//
#define STATUS_DATATYPE_MISALIGNMENT     ((NTSTATUS)0x80000002L)    // winnt


Tommy   (2004-04-15 10:15:00) [10]

Вы были правы...статус не такой,-таким показал мне его дебагер.
Ексепшон показал 80000002 (6 нулей).
очень жду ответов !!! :)
Спасибо за помош!!!


Игорь Шевченко   (2004-04-14 18:48:00) [11]

Tommy   (14.04.04 17:28)

Интересует точное значение статуса. Сделай
if Status <> 0 then
 raise Exception.CreateFmt('Status = %.8x',[Status]);
Результат в студию.


BiN   (2004-04-14 17:54:00) [12]

>Tommy

кстати, а почему у тебя метод Execute не процедура, а функция? (!)


Digitman   (2004-04-14 17:51:00) [13]


> не в потоке а на таймере


а процедура обработки события таймера, по твоему получается, исполняется ВНЕ контекста какого-либо кодового потока ..


Tommy   (2004-04-14 17:28:00) [14]

TSystem_Basic_Information = packed record  
   dwUnknown1: DWORD;  
   uKeMaximumIncrement: ULONG;  
   uPageSize: ULONG;  
   uMmNumberOfPhysicalPages: ULONG;  
   uMmLowestPhysicalPage: ULONG;  
   uMmHighestPhysicalPage: ULONG;  
   uAllocationGranularity: ULONG;  
   pLowestUserAddress: Pointer;  
   pMmHighestUserAddress: Pointer;  
   uKeActiveProcessors: ULONG;  
   bKeNumberProcessors: byte;  
   bUnknown2: byte;  
   wUnknown3: word;  
 end;  

Кстати не в потоке а на таймере все работает отлично...
в чем е дело?


Игорь Шевченко   (2004-04-14 16:05:00) [15]


> status := NtQuerySystemInformation(SystemBasicInformation,
> @SysBaseInfo, SizeOf(SysBaseInfo), nil);
>  //if status <> 0 then Exit;


Приведи объявление
TSystem_Basic_Information


Сходи на http://www.schevchenko.net.ru/SRC/QuerySystemInformation_60.zip


Игорь Шевченко   (2004-04-14 16:04:00) [16]


> status = -147483646


Не бывает такого статуса.


Tommy   (2004-04-14 15:49:00) [17]

status = -147483646


Tommy   (2004-04-14 15:49:00) [18]

V tom to i delo chto ne znaju gde eto iskat...esli
mozhete podskazhite....


Digitman   (2004-04-14 15:29:00) [19]

if status <> 0 then здесь ты должен в соотв-вии с док-цией определить реальную причину отказа, проанализировав код ошибки ... чего ты не удосужился сделать ... прежде чем постить вопрос


Tommy   (2004-04-14 15:08:00) [20]

Создаю поток
 CPUinf:=TCPUinf.Create(true);
 CPUinf.FreeOnTerminate:=true;
 CPUinf.Resume;

и в нем делаю следуюшее

function TCPUinf.execute;
var
 SysBaseInfo: TSystem_Basic_Information;
 SysPerfInfo: TSystem_Performance_Information;
 SysTimeInfo: TSystem_Time_Information;
 status: Longint; {long}
 dbSystemTime: Double;
 dbIdleTime: Double;

 bLoopAborted : boolean;  

begin  
 if @NtQuerySystemInformation = nil then
   NtQuerySystemInformation := GetProcAddress(GetModuleHandle('ntdll.dll'),
     'NtQuerySystemInformation');

 // get number of processors in the system

 status := NtQuerySystemInformation(SystemBasicInformation, @SysBaseInfo, SizeOf(SysBaseInfo), nil);
 //if status <> 0 then Exit;

  if status <> 0 then exit;-> vot zdes status<>0 a doljen bit 0 dlia dalneishei raboti...
pochemu?
 ...
end;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо