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

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

Загрузка процессора [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;


Наверх

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