Главная страница
    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.47 MB
Время: 0.04 c
14-1125569419
12DFBDDh
2005-09-01 14:10
2005.09.25
"Колхоз" мифы и реальность


3-1123678151
Ega23
2005-08-10 16:49
2005.09.25
output-параметры в рекурсивных выборках


14-1125250066
Ксардас
2005-08-28 21:27
2005.09.25
Что это за сетевая атака такая Helkern?


1-1125716526
Ivanov
2005-09-03 07:02
2005.09.25
*.pak - архив


1-1125480879
xayam
2005-08-31 13:34
2005.09.25
TMonthCalendar





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский