Текущий архив: 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