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

Вниз

Загрузка процессора   Найти похожие ветки 

 
Freez   (2005-07-27 12:55) [0]

Здравствуйте.
Пишу программу на чистом апи.
Окна в программе нет, т.е. пишу просто процесс.
весь код только одна процедура.
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
но тогда вообще программа останавливается на этой строке и все. =(


 
alpet ©   (2005-07-27 13:13) [1]

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;


 
Dot   (2005-07-27 14:35) [2]

Однако все равно 99% ЦП


 
alpet ©   (2005-07-27 14:38) [3]

Приведи код, что-то мне не верится, что с учетом Sleep (100) будет такая загрузка ЦП.


 
Dot   (2005-07-27 14:44) [4]

у меня там проверка появления окна
H:=Findwindow("IEFrame", nil);
if h <> 0 then
begin
...
end;
Sleep(1000);

Так вот пока окно не появилось 99% .. =(


 
alpet ©   (2005-07-27 15:59) [5]

Dot   (27.07.05 14:44) [4]
Довольно абстрактный код. По идее если выполняется Sleep - целую секунду (как правило чуть больше) процессор свободен от твоего потока, так что совсем не ясно чем его загрузка вызывается. Протрассируй свой код под отладчиком - 99,999% что Sleep у тебя до нахождения окна не вызывается.


 
Масяня ©   (2005-07-27 20:12) [6]

Здесь тебе придется вызывать ассемблерный код


 
kblc ©   (2005-07-28 08:17) [7]

У меня вот такой код занимает 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-28 10:40) [8]

Удалено модератором


 
Slym ©   (2005-07-29 04:40) [9]

Тебе проще создать таки окно... И поставить хук на создание окон... в хуке и ловить "IEFrame"


 
Fay ©   (2005-07-29 06:55) [10]

2 Масяня ©   (27.07.05 20:12) [6]
Вызывать? Откуда, куда и зачем?


 
VideoLord ©   (2005-08-03 13:55) [11]

Из исходников 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 кб размером.



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

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

Наверх




Память: 0.49 MB
Время: 0.051 c
1-1125898664
leonidus
2005-09-05 09:37
2005.09.25
Как обновить TEdit


2-1124122524
Андрей Молчанов
2005-08-15 20:15
2005.09.25
проверить, подходит ли файл заданной маске


14-1125014136
программер__
2005-08-26 03:55
2005.09.25
Научиться играть на пианино


2-1124177519
Саша У
2005-08-16 11:31
2005.09.25
Как переименовать много компонентов?


3-1123828146
Rentgen
2005-08-12 10:29
2005.09.25
ADO. Как сделать отбор по нескольким записям Master-Slave?