![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Загрузка процессора [D7, WinXP]
Freez © (2005-07-27 12:55:00)Здравствуйте.
Пишу программу на чистом апи.
Окна в программе нет, т.е. пишу просто процесс.
весь код только одна процедура.
begin
while GetMessage(Msg, HInstance, 0, 0) do
begin
if poisk = 1 then
begin
...
end;
TranslateMessage(msg);
DispatchMessage(msg);
end;
... Вот и все.. однако блин 99% загрузки процессора как не крути.. Как мне можно сделать чтобы такого не было.
пробовал
while GetMessage(Msg, 0, 0, 0) do
но тогда вообще программа останавливается на этой строке и все. =(
VideoLord (2005-08-03 13:55:00) [1]Из исходников VCL, там где TApplication описан, можно сделать следующее:
-- DPR ---
program Test;
uses AppNew;
begin
repeat
Application.HandleMessage;
// можно здесь делать что-то полезное...
until Application.Terminated;
end.
--- PAS ---
unit AppNew;
interface
uses SysUtils, Classes, Windows, Messages, ExtCtrls;
type
TApplication = class
function ProcessMessage(var Msg: TMsg): Boolean;
procedure ProcessMessages;
procedure HandleMessage;
public
Terminated: boolean;
end;
function WaitMessage: boolean; external user32 name 'WaitMessage';
var
Application: TApplication;
implementation
{TApplication}
function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
begin
Result := False;
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
Result := True;
if Msg.Message <> WM_QUIT then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end else Terminated:=True;
end;
end;
procedure TApplication.ProcessMessages;
var Msg: TMsg;
begin
while ProcessMessage(Msg) do;
end;
procedure TApplication.HandleMessage;
var Msg: TMsg;
begin
if not ProcessMessage(Msg) then WaitMessage;
end;
initialization
Application:=TApplication.Create;
Application.Terminated:=false;
// ... а можно и тут какие-нибудь объекты создать
// например таймеры или COM-порты
finalization
Application.Free;
end.
---
При этом за собой не тянется forms.pas и экзешник получается около 30 кб размером.
Fay (2005-07-29 06:55:00) [2]2 Масяня © (27.07.05 20:12) [6]
Вызывать? Откуда, куда и зачем?
Slym (2005-07-29 04:40:00) [3]Тебе проще создать таки окно... И поставить хук на создание окон... в хуке и ловить 'IEFrame'
(2005-07-28 10:40:00) [4]Удалено модератором
kblc (2005-07-28 08:17:00) [5]У меня вот такой код занимает 0% от проца...
program Project1;
uses Windows;
var msg: tagMSG;
begin
while true do
begin
if PeekMessage (msg, 0, 0, 0, PM_REMOVE) then
begin
TranslateMessage (msg);
DispatchMessage (msg);
end else Sleep(10);
//WHAT U GONNA DO? DO IT HERE!
end;
end.
Масяня (2005-07-27 20:12:00) [6]Здесь тебе придется вызывать ассемблерный код
alpet (2005-07-27 15:59:00) [7]Dot (27.07.05 14:44) [4]
Довольно абстрактный код. По идее если выполняется Sleep - целую секунду (как правило чуть больше) процессор свободен от твоего потока, так что совсем не ясно чем его загрузка вызывается. Протрассируй свой код под отладчиком - 99,999% что Sleep у тебя до нахождения окна не вызывается.
Dot (2005-07-27 14:44:00) [8]у меня там проверка появления окна
H:=Findwindow('IEFrame', nil);
if h <> 0 then
begin
...
end;
Sleep(1000);
Так вот пока окно не появилось 99% .. =(
alpet (2005-07-27 14:38:00) [9]Приведи код, что-то мне не верится, что с учетом Sleep (100) будет такая загрузка ЦП.
Dot (2005-07-27 14:35:00) [10]Однако все равно 99% ЦП
alpet (2005-07-27 13:13:00) [11]1. Ты организуешь цикл сообщений. hInstance (он же по сути адрес отображения exe-файла приложения в АП процесса) не имеет никакого отношения к сообщениям, так что забудь про него.
2. Если ты хочешь не только получать сообщения, но и выполнять Idle процессинг - используй PeekMessage и Sleep для того чтобы поток не занимал ресурсы процессора монопольно.
while true do
begin
if PeekMessage (msg, 0, 0, 0, PM_REMOVE) then
begin
TranslateMessage (msg);
DispatchMessage (msg);
end
SomeIdleProc; // проверка температуры, etc...
sleep (100);
end;