Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.029 c
3-1083330901
Narayan
2004-04-30 17:15
2004.05.30
случайным образом


8-1079528146
16xmax
2004-03-17 15:55
2004.05.30
Графика


1-1084898089
Beglec
2004-05-18 20:34
2004.05.30
Подскажите где можно взять TChart, но более мощный и халявный ;)


14-1083794584
AlerX
2004-05-06 02:03
2004.05.30
RPG что происходит внутри


3-1083919987
lockheed_man
2004-05-07 12:53
2004.05.30
Проблемы с сохранением если не все поля грида заполнены





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский