Как получить приложение Дельфи (это работает) сделать что-то в определенное время / дата

Мое приложение находится в системном лотке, когда это не используется.

Пользователь может настроить события для появления в конкретном расписании. Например, они могут путь задача, выполненная с понедельника по пятницу в 17:00 или каждую среду в 15:00 или на 16-м из каждого месяца в 10:00.

Принятие моей программы Дельфи всегда работает, это запускается при начальной загрузке, каков лучший способ в Дельфи для поддержки инициирования этих запланированных событий.

Очевидно, TTimer может использоваться для планирования событий на основе прошедшего времени, но они не кажутся подходящий для этой проблемы.

Удачи

11
задан SamH 10 January 2010 в 15:58
поделиться

6 ответов

Вы можете использовать мою CRON SCROMIS PROPULER . Это даже поддерживает некоторые вещи, которые Cron нет. Интервальные события, например, и от / до таймфрейма. Я использую его во многих моего программного обеспечения, и он доказал себя довольно полезным. Это свободный, очень легкий, работает в потоках и проходит производство. Если вам нужна дополнительная помощь, просто послать меня.

Другие способы:

  1. Используйте API планирования Windows PROPULING, как уже предложено. Но это может измениться между ОС-эс.
  2. Используйте JCL , который имеет блок планировщика (компонент в JVCL), но я обнаружил, что один сложно использовать из кода напрямую. Вот почему я написал свой собственный.
17
ответ дан 3 December 2019 в 03:35
поделиться

MVVM - это просто шаблон дизайна . Вам не нужно это, если вам не комфортно с WPF. Если вы изучаете WPF, я предлагаю вам сначала завершить книгу, а затем узнать о MVVM. Если вы попробуете изучить обоих, вы бы попытались реализовать MVVM в каждом простом приложении WPF или не понимаю некоторую функцию WPF, что использует MVVM.

P.S: Я пришел к этому выводу, когда я столкнулся с проблемой. Я до сих пор не понимаю, как ViewModel может создать новый вид, если он ничего не знает об этом.

-121--2476966-

Я бы использовал API планировщика задач Microsoft для этого:

http://msdn.microsoft.com/en-us/library/aa383614 (vs.85) .aspx

Есть Delphi Wrappers для API, если вы не хотите делать «грязную работу», но я не знаю, есть ли свободный. Возможно, вы посмотрите на

Если вы не Хотите использовать Microsoft Scheduler, есть такие вещи, как компонент Cronjob, доступный здесь: http://www.appcontrols.com/components.html . Это условно известно, но легко реализовать (просто событие OnaLert).

8
ответ дан 3 December 2019 в 03:35
поделиться

Вы можете реализовать какую-то взаимосвязь в вашей программе и вызвать эти события через IPC по программе, называемой службой планирования Windows. Этот подход имеет то преимущество, что вам не нужно писать пользовательский интерфейс для настройки расписания, а также, что IPC может оказаться полезным другими способами.

1
ответ дан 3 December 2019 в 03:35
поделиться

Я не включаю основной класс или не строю основную библиотеку или что-либо из этого.

да, вы:

проблемы обработки «javax/xml/XMLConstants.class»

java. * и javax. * Оба числа. вы можете использовать переключатель --core-library, если хотите проигнорировать это в тестовом приложении, но обратите внимание на предупреждение: "ваше приложение все равно не сможет построить или запустить, в какой-то момент. Пожалуйста, будьте готовы к сердитым клиентам, которые обнаружат, например, что ваше приложение перестает работать после обновления операционной системы. Вы будете виноваты в этой проблеме. "

Правильное исправление, как говорится, для приложения доставки, состоит в том, чтобы переупаковать эти классы (т.е. переместить их в новый каталог, соответствующим образом отредактировать их" упаковочные "строки и обновить" импортные "строки в их вызывающих).

-121--2159438-

Я тестирую API REST в данный момент и нашел REST Client очень хорошим. Это программа GUI, но, тем не менее, можно сохранять и восстанавливать запросы в виде XML-файлов (или разрешать их создание), встраивать, писать тестовые сценарии и т.д. И это на основе Java (что не является случайным преимуществом, но вы упомянули об этом).

Минус точек для сеансов записи. Клиент REST хорошо подходит для безгражданства.

Если это не соответствует вашим потребностям, я бы пошел на уже упомянутую механизацию (или WWW-Mechanize , как это называется в CPAN).

-121--3432336-

Поскольку приложение запущено, можно использовать событие простоя для проверки того, истекла ли уже установленная дата/время, и если да, то для выполнения синхронизации. Единственным побочным эффектом этого подхода является то, что ваше событие не будет инициировано, если приложение занято, но не будет таймер (для работы TTimer очередь сообщений должна быть обработана, или приложение должно быть «Неактивно», если вы не используете многопоточный таймер).

uses
  ...,DateUtils; // contains IncMinute

type
  TForm1 = Class(TForm)
    :
    procedure FormCreate(Sender: TObject);
  private 
    fTargetDate : tDateTime;
    procedure AppIdle(Sender: TObject; var Done: Boolean);
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  fTargetDate := 0.0;
  Application.OnIdle := AppIdle;
  fTargetDate := IncMinute(Now,2);
end;

procedure TForm1.AppIdle(Sender: TObject; var Done: Boolean);
begin
  if (fTargetDate <> 0.0) and (Now >= fTargetDate) then
    begin
      fTargetDate := 0.0;
      ShowMessage('started');
    end;
 end;

EDIT Если требуется выполнить что-либо несколько раз, поместите их в упорядоченный список по дате/времени, а затем отслеживайте только СЛЕДУЮЩЕЕ время выполнения. При выполнении какой-либо операции она удаляется для списка (или переносится обратно в список и список пересортировывается).

0
ответ дан 3 December 2019 в 03:35
поделиться

Другим вариантом было бы создание TThread, выполняющего управление таймером:

type
  TestThreadMsg = class(tThread)
  private
    fTargetDate : tDateTime;
    fMsg : Cardinal;
  protected
    procedure Execute; override;
    procedure NotifyApp;
  public
    constructor Create( TargetDate : TDateTime; Msg:Cardinal);
  end;

implementation:

constructor TestThreadMsg.Create(TargetDate: TDateTime; Msg: Cardinal);
begin
  inherited Create(True);
  FreeOnTerminate := true;
  fTargetDate := TargetDate;
  fMsg := Msg;
  Suspended := false;
end;

procedure TestThreadMsg.Execute;
begin
  Repeat
    if Terminated then exit;
    if Now >= fTargetDate then
      begin
        Synchronize(NotifyApp);
        exit;
      end;
    Sleep(1000); // sleep for 1 second, resoultion = seconds
  Until false;
end;

procedure TestThreadMsg.NotifyApp;
begin
  SendMessage(Application.MainForm.Handle,fMsg,0,0);
end;

, который затем можно подключить к основной форме:

const
  WM_TestTime = WM_USER + 1;

TForm1 = Class(TForm)
  :
  procedure FormCreate(Sender: TObject);
  procedure WMTestTime(var Msg:tMessage); message WM_TestTime;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  TestThreadMsg.Create(IncSecond(Now,5),WM_TestTime);
end;

procedure TForm1.WMTestTime(var Msg: tMessage);
begin
  ShowMessage('Event from Thread');
end;
0
ответ дан 3 December 2019 в 03:35
поделиться

Это должно быть сделано:

list($d, $m, $y) = explode('/', $datedue);
$billdate = date('Y-m-d', mktime(0,0,0,$m,$d,$y);

Или это может быть без функций даты, как Гумбо предложил:

list($d, $m, $y) = explode('/', $datedue);
$billdate = "$y-$m-$d"; 

Я бы рекомендовал использовать дату , хотя если вы подозреваете, что вам нужно изменить формат в будущем. Нет необходимости использовать регулярное выражение для такого простого разделения. В этом случае взрыв будет намного быстрее.

Функции регулярного выражения ereg _ устарели как функции PHP 5,3,0 и будут удалены в PHP 6. Для регулярных выражений используйте функции preg _ .

О скрытии ошибки; никогда не следует скрывать уведомления при разработке, поскольку они помогают создать лучший код. Без этого уведомления вы бы с радостью использовали ereg , и ваше приложение ужасно сломалось бы при обновлении сервера до PHP 6. Однако можно управлять количеством отображаемых ошибок с помощью error _ reporting () . Отключение error_reporting при переходе к продуктивной эксплуатации сайта может быть хорошей идеей.

BTW, начинайте принимать некоторые ответы, если вы считаете их полезными.

-121--4104041-

Вам не нужно делать ничего особенного для последовательности. Последовательности Perl по умолчанию UTF-8, начиная с Perl 5.8.

perl -CO -le 'print "\x{2603}"' | xargs perl -le 'print "I saw @ARGV"'

Вышеприведенный код отлично работает на Ubuntu 9.04, OS X 10.6 и FreeBSD 7.

Команда VinylShrub показывает хорошую точку, Мы видим определенное различие между

perl -Mutf8 -wle ';print utf8::is_utf8($ARGV[0]) ? "t" : "f"' a

и

perl -Mutf8 -CA -wle ';print utf8::is_utf8($ARGV[0]) ? "t" : "f"' a
-121--2307582-

Вам нужен компонент планирования. Есть много доступных , однако я, кажется, не могу найти никакого свободного. Вы всегда можете создать его самостоятельно, на основе TTimer, или попытаться получить доступ к API планирования задач .

Однако , наличие таймера, который выполняет задачу каждую минуту, чтобы проверить, должна ли задача, намного проще .

1
ответ дан 3 December 2019 в 03:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: