Текущий архив: 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.49 MB
Время: 0.037 c