Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать планировщик? замучался... не получается 
:(
    Опции темы
h2o
Дата 23.11.2005, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: 1
Всего: 1



А как быть с днями недели, например если указанно, что нужно запустить мою процедуру в пятницу 13го числа в 14:00?

как сделать дни недели?
Добавлено @ 12:04
Цитата(Snowy @ 22.11.2005, 13:26)
Я же сказал - у Рихтера все подробно расписано.
Найди в инете книгу:
"Джефри Рихрер - Создание эффективных WIN32-приложений" в chm формате.
Не раз еще пригодится. Это Библия WinAPI программиста.
Про таймеры читай в главе 9.


ага! была бы ещё она на делфи! на С++ я не шарю вообще!
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
Alexeis
Дата 23.11.2005, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Вот пример с сайта delphiword
Код

uses SysUtils;
...

function TForm1.DayOfWeekRus(S: TDateTime): string;
begin
  case DayOfWeek(S) of
    1: Result := 'Воскресенье';
    2: Result := 'Понедельник';
    3: Result := 'Вторник';
    4: Result := 'Среда';
    5: Result := 'Четверг';
    6: Result := 'Пятница';
    7: Result := 'Суббота';
  end;
end;





--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
h2o
Дата 23.11.2005, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: 1
Всего: 1



а как с CreateWaitableTimer в Делфи работать?
где запускать, как что там вообще делать?
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
Alexeis
Дата 23.11.2005, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459





--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
h2o
Дата 25.11.2005, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: 1
Всего: 1



Дак я читал уже! Всё равно не понял! я и пример для Делфи в инете не нашёл!!! Там вообще примеров нет, а если и встречаются, то на С++. Может у кого примерчик есть?
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
h2o
Дата 25.11.2005, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: 1
Всего: 1



упс! нашёл:
Код

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Класс-оболочка для объекта синхронизации WaitableTimer.

Класс представляет собой оболочку для объекта синхронизации WaitableTimer,
существующего в операционных системах, основанных на ядре WinNT.

Методы.
--------------
Start - запуск таймера.

Stop - остановка таймера.

Wait - ожидает срабатывания таймера заданное количество миллисекунд и
возвращает результат ожидания.

Свойства.
--------------
Time : TDateTime - дата/время когда должен сработать таймер.

Period : integer - Период срабатывания таймера. Если значение равно 0, то
таймер срабатывает один раз, если же значение отлично от нуля, таймер будет
срабатывать периодически с заданным интервалом, первое срабытывание произойдет
в момент, заданный свойством Time.

LongTime : int64 - альтернативный способ задания времени срабатывания. Время
задается в формате UTC.

Handle : THandle (только чтение) - хендл обекта синхронизации.

LastError : integer (только чтение) - В случае если метод Wait возвращает
wrError, это свойство содержит значение, возвращаемое функцией GetLastError.

Зависимости: Windows, SysUtils, SyncObjs
Автор:       vuk
Copyright:   Алексей Вуколов
Дата:        25 апреля 2002 г.
***************************************************** }

unit wtimer;

interface

uses
  Windows, SysUtils, SyncObjs;

type

  TWaitableTimer = class(TSynchroObject)
  protected
    FHandle: THandle;
    FPeriod: longint;
    FDueTime: TDateTime;
    FLastError: Integer;
    FLongTime: int64;
  public

    constructor Create(ManualReset: boolean;
      TimerAttributes: PSecurityAttributes; const Name: string);
    destructor Destroy; override;

    procedure Start;
    procedure Stop;
    function Wait(Timeout: longint): TWaitResult;

    property Handle: THandle read FHandle;
    property LastError: integer read FLastError;
    property Period: integer read FPeriod write FPeriod;
    property Time: TDateTime read FDueTime write FDueTime;
    property LongTime: int64 read FLongTime write FLongTime;

  end;

implementation

{ TWaitableTimer }

constructor TWaitableTimer.Create(ManualReset: boolean;
  TimerAttributes: PSecurityAttributes; const Name: string);
var
  pName: PChar;
begin
  inherited Create;
  if Name = '' then
    pName := nil
  else
    pName := PChar(Name);
  FHandle := CreateWaitableTimer(TimerAttributes, ManualReset, pName);
end;

destructor TWaitableTimer.Destroy;
begin
  CloseHandle(FHandle);
  inherited Destroy;
end;

procedure TWaitableTimer.Start;
var
  SysTime: TSystemTime;
  LocalTime, UTCTime: FileTime;
  Value: int64 absolute UTCTime;

begin
  if FLongTime = 0 then
  begin
    DateTimeToSystemTime(FDueTime, SysTime);
    SystemTimeToFileTime(SysTime, LocalTime);
    LocalFileTimeToFileTime(LocalTime, UTCTime);
  end
  else
    Value := FLongTime;
  SetWaitableTimer(FHandle, Value, FPeriod, nil, nil, false);
end;

procedure TWaitableTimer.Stop;
begin
  CancelWaitableTimer(FHandle);
end;

function TWaitableTimer.Wait(Timeout: Integer): TWaitResult;
begin
  case WaitForSingleObjectEx(Handle, Timeout, BOOL(1)) of
    WAIT_ABANDONED: Result := wrAbandoned;
    WAIT_OBJECT_0: Result := wrSignaled;
    WAIT_TIMEOUT: Result := wrTimeout;
    WAIT_FAILED:
      begin
        Result := wrError;
        FLastError := GetLastError;
      end;
  else
    Result := wrError;
  end;
end;

end.
Пример использования: 

// Пример создания таймера, который срабатывает по алгоритму "завтра в это же
// время и далее с интервалом в одну минуту".

var
  Timer: TWaitableTimer;
begin
  Timer := TWaitableTimer.Create(false, nil, '');
  Timer.Time := Now + 1; //завтра в это же время
  Timer.Period := 60 * 1000; //Интервал в 1 минуту
  Timer.Start; //запуск таймера
end;


теперь непонятно ГДЕ его запускать, ГДЕ Останавливать и ГДЕ указать свою процедуру выполнить, когда он сработатет?
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
Snowy
Дата 25.11.2005, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Ну вот чисто для теста накатал:
Код

program Project1;

uses
  Windows, SysUtils, wtimer, SyncObjs;

var
  Timer: TWaitableTimer;


begin
  Timer := TWaitableTimer.Create(false, nil, 'MyCoolTimer'); // Создали таймер с именем MyCoolTimer
  Timer.Time := Now + StrToTime('00:00:03'); // Время первого срабатывания через 3 секунды
  // можно записать сюда любой TDateTime

  Timer.Period := 5000; // после первого срабатывания, срабатывать каждые 5 секунд
  Timer.Start; // Запускаем таймер
  repeat // это общий цикл
    repeat // это цикл до срабатывания таймера
      if Timer.Wait(1000) = wrSignaled then // Ждем ответа от таймера в течении секунды
      begin // если таймер сработал
        MessageBox(0,'Кря-кря!','Таймер', MB_OK); // кричим Кря-Кря или на свое усмотрение
      end
      else // если не сработал, то делаем что-нибудь
        // например, если бы пример был с формой, то нужно делать:
        // Application.ProcessMessages
        ;
    until false; // в примере цикл крутит, пока не сработает таймер
  until false; // в примере цикл крутит вечно
end.


Добавлено @ 18:05
P.S. Это пример. Он не вырубается.
Бырубаем через дельфи по Ctrl+F2 или диспетчер задач.
PM MAIL   Вверх
h2o
Дата 28.11.2005, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: 1
Всего: 1



if Timer.Wait(1000) = wrSignaled then // Ждем ответа от таймера в течении секунды

на эту строку ругается, типа "[Error] Unit1.pas(789): Undeclared identifier: 'wrSignaled'"
и чё делать?
Добавлено @ 12:19
ой! голова моя дырявая, разобрался!
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
sexton
Дата 28.11.2005, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sexton=Пономарь (eng)
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 5.5.2004
Где: Ульяновск

Репутация: 1
Всего: 9



Может и не в тему, но советую посмотреть компоненты для планировщиков от TMS (www.tmssoftware.com)
PM MAIL WWW ICQ   Вверх
h2o
Дата 29.11.2005, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: 1
Всего: 1



Snowy а как его хоть останавливать?никак не могу. всё время ошибки возникают...
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
Romikgy
Дата 29.11.2005, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Код

Timer.Stop;



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
h2o
Дата 29.11.2005, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: 1
Всего: 1



а точно! не работало из-за неправильно организованного цикла! я ступил!

--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
Демо
Дата 29.11.2005, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



А почему ты не хочешь свой планировщик в виде сервиса оформить?
По-моему так будет логичнее.


--------------------
    
PM MAIL ICQ Skype   Вверх
h2o
Дата 30.11.2005, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: 1
Всего: 1



у меня не совсем планировщик, и он с формой! так, что сервис отпадает! блин! я уже вообще его замучился делать! нифига не получается!

Вообще мне нужно, по условиям времени... заданых юзеров запускать 1 процедуру. тоесть есть варианты:
1. на определенный день в определенное время
2. автоматом каждый день
3. автоматом раз в неделю
4. автоматом раз в месяц

Я пробовал делать с помощью:
1. Потока (там ошибки, зависоны), отказался от него
2. С помощью таймера (тока 1е условие реализовал, остальные не получилось)
3. С помощью WaitAbleTimer (может я там что-то и не правильно делал, но тоже не получилось)

Вообщем я просто опустил руки! я непонимаю как можно реализовать условия выше.

Я уже и здесь вопросы задавал и мне помогали, но так и не разобрался! smile

А всего-то, нужно:
1. на определенный день в определенное время - если дата и время сейчас >= указанной дате и времени, то запускаем процедуру, если нет ждём 5 сек и т.д
2. автоматом каждый день - если сегодня процедура в такое-то время ещё не запускалась, тогда
запускаем, если время не подошло ждем, а если запускалась, то нужно завтро и в последущие дни тоже самое делать.
3. тоже самое но не каждый день а раз в неделю (в месяц)! и т.д

Я не смог правильно сделать проверку условия, а если сделать, тогда хоть всеми способами можно будет реализовать!

вот такой вот я стопор!

если кто-хоть когда-нибудь это делал, дайте приерчик!
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
Демо
Дата 30.11.2005, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Может всё обсудим снова?

1. Зачем тебе форма?


--------------------
    
PM MAIL ICQ Skype   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1708 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.