Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2012, 14:16   #11
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Я бы и рад отладить, да пишу на xe2 где удаленный отладчик не работает(точнее список процессов на аттача).

Думаю я знаю в чем проблема. Вы используете TTimer который работает с системным оконным сообщением WM_TIMER. А я использую мультимедийный таймер:
Цитата:
unit clMMTimerClass;

interface

uses
Winapi.Windows,
System.Classes,
Winapi.MMSystem;

type
TMMTimer = class
private
FInterval: integer;
FID: UINT;
FOnTimer: TNotifyEvent;
function GetEnabled: boolean;
procedure SetEnabled(Value: boolean);
procedure SetInterval(Value: integer);
protected
procedure DoTimer; virtual;
public
property Interval: integer read FInterval write SetInterval;
property Enabled: boolean read GetEnabled write SetEnabled;
property OnTimer: TNotifyEvent read FOnTimer write FOnTimer;
end;

implementation

{ TMMTimer }

procedure MMCallBack(uTimerID, uMsg: UINT; dwUser, dw1, dw2: DWORD); stdcall;
begin
if dwUser <> 0 then
TMMTimer(dwUser).DoTimer;
end;

procedure TMMTimer.DoTimer;
begin
if Assigned(FOnTimer) then
FOnTimer(Self);
end;

function TMMTimer.GetEnabled: boolean;
begin
Result := FID <> 0;
end;

procedure TMMTimer.SetEnabled(Value: boolean);
begin
if Enabled <> Value then
begin
if FID <> 0 then
begin
timeKillEvent(FID);
FID := 0;
end
else
begin
FID := timeSetEvent(FInterval, 0, @MMCallBack, DWORD(Self),
TIME_CALLBACK_FUNCTION or TIME_PERIODIC or TIME_KILL_SYNCHRONOUS);
end;
end;
end;

procedure TMMTimer.SetInterval(Value: integer);
var
oldEnabled: boolean;
begin
if FInterval <> Value then
begin
oldEnabled := Enabled;
Enabled := false;
FInterval := Value;
Enabled := oldEnabled;
end;
end;

end.
Человек_Борща вне форума Ответить с цитированием
Старый 04.04.2012, 14:41   #12
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

C твоим таймером тоже работает

Код:
unit MainUnit;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.SvcMgr, Vcl.Dialogs, Vcl.ExtCtrls, TimerUnit;

type
  TSysInfo = class(TService)
    procedure ServiceBeforeInstall(Sender: TService);
    procedure ServiceCreate(Sender: TObject);
    procedure ServiceDestroy(Sender: TObject);
    procedure ServiceExecute(Sender: TService);
    procedure ServiceShutdown(Sender: TService);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
  private

    { Private declarations }
    fTimer: TTimer;
    fmmTimer: TMMTimer;
    procedure OnfTimer(Sender: TObject);
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;

var
  SysInfo: TSysInfo;

implementation

{$R *.DFM}



procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  SysInfo.Controller(CtrlCode);
end;

function TSysInfo.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TSysInfo.ServiceBeforeInstall(Sender: TService);
begin
//
end;

procedure TSysInfo.ServiceCreate(Sender: TObject);
begin
//
end;

procedure TSysInfo.ServiceDestroy(Sender: TObject);
begin
//
end;

procedure TSysInfo.ServiceExecute(Sender: TService);
begin

while not Terminated do
  begin
    Sleep(100);
    ServiceThread.ProcessRequests(False );
  end;
end;

procedure TSysInfo.ServiceShutdown(Sender: TService);
begin
//
end;

procedure TSysInfo.ServiceStart(Sender: TService; var Started: Boolean);
begin
fmmTimer := TMMTimer.Create;
fmmTimer.Interval := 5000;
fmmTimer.OnTimer := OnfTimer;
fmmTimer.Enabled := True;

//fTimer := TTimer.Create(Owner);
//fTimer.Interval := 5000;
//fTimer.OnTimer := OnfTimer;
//fTimer.Enabled := true;
//Started := true;
end;

procedure TSysInfo.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
FreeAndNil(fmmTimer);
end;

procedure TSysInfo.OnfTimer(Sender: TObject);

begin


  MessageBox(0,'Текст из сервиса', 'Сообщение',  MB_OK+MB_SERVICE_NOTIFICATION);
end;


end.
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 04.04.2012, 22:37   #13
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

даже, когда закрыаешь сообщение?

Сервис не интерактивный.
Человек_Борща вне форума Ответить с цитированием
Старый 06.04.2012, 08:49   #14
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Даже, когда закрываешь. Сервис не интерактивный. Работает. Каждые 5 сек. - сообщение.
Дело во флаге
Код:
 MessageBox(0,'Текст из сервиса', 'Сообщение',  MB_OK+MB_SERVICE_NOTIFICATION);
Знающий не говорит, говорящий не знает (С) Лао Цзы

Последний раз редактировалось Krok27; 06.04.2012 в 10:30.
Krok27 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно организовать сохранение в файл delphi JK0 Помощь студентам 1 21.12.2010 21:14
Как правильно организовать непростой шаблон двоичного дерева? nowaalex Общие вопросы C/C++ 10 02.12.2010 02:47
как правильно организовать продажу своего софта? broderweb Свободное общение 11 02.12.2009 17:41
Как организовать прием и работу кладра tarakan1983 БД в Delphi 10 12.03.2009 18:30
ADO + SQL Server. Как правильно организовать одновременную работу с таблицей Mouse123 БД в Delphi 17 04.07.2008 17:35