Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.30;
Скачать: CL | DM;

Вниз

NTQuerySystemInformation and Threads   Найти похожие ветки 

 
Tommy   (2004-04-14 14:23) [0]

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


 
SammIk ©   (2004-04-14 14:32) [1]

Потомучто ты отправил сообщение 14, а надо было 15.
Знаешь положение луны и все такое, да и магия цифер!
Во как, попробуи написать 15, должно помочь....
А если серьезно, то надо подробнее описывать проблему, попробуи
еще разок) Гы


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

Создаю поток
 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;


 
Digitman ©   (2004-04-14 15:29) [3]

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


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

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


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

status = -147483646


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


> status = -147483646


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


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


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


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


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


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

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;  

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


 
Digitman ©   (2004-04-14 17:51) [9]


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


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


 
BiN ©   (2004-04-14 17:54) [10]

>Tommy

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


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

Tommy   (14.04.04 17:28)

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


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

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


 
Digitman ©   (2004-04-15 10:21) [13]

//
// 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


 
Digitman ©   (2004-04-15 10:27) [14]

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

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

status := NtQuerySystemInformation(..)

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


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

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


 
Digitman ©   (2004-04-15 11:01) [16]

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


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

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


 
Digitman ©   (2004-04-15 11:21) [18]


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


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

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

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


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

:)
да это по спешке,руками писал без 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} или нет?
Видите что делается когда люди не знают директив! :)


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

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


 
Digitman ©   (2004-04-15 11:55) [21]


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2004.05.30;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.025 c
4-1082381434
S_S_S
2004-04-19 17:30
2004.05.30
Как переместить системные кнопки управления окном


3-1083544213
Narayan
2004-05-03 04:30
2004.05.30
n первых записей


3-1084004683
Andrew Frol
2004-05-08 12:24
2004.05.30
Можно ли программно в ODBC прописывать DSN???


7-1082529809
ZDDR
2004-04-21 10:43
2004.05.30
иконка екзехи


7-1082619506
Pontic
2004-04-22 11:38
2004.05.30
Блокировка управления