喫茶XRAYトップページ


[1593] 自動で保存して欲しいんですが返信 削除
2008/4/2 (水) 20:50:07 taki
マスター、皆さん こんばんは。

パソコンが暇な時にデータを自動でバックアップしてくれる
ようにはできないのでしょうか。
例えば、Memoコンポーネントに文字を入力していて、入力が
一段落した時にファイルにバックアップをしてくれる。
といった感じです。

Application.OnIdleを試してみたのですが、これってCPUが
目一杯動いている時でも、Delphiのコードが実行されて
いなければ、イベントが呼び出されるのですね。
※私が試してみた所ではそのようになりました。

つまり、漢字変換とかでCPUが忙しい時でもイベントが
呼び出されてしまいます。

CPUの稼働率が低くなって、1秒間ほど入力がなければ、
「すみません。保存しますのでちょっと待ってね。」と
保存作業が行われるのが理想なのですが。

[1594] Re:自動で保存して欲しいんですが返信 削除
2008/4/3 (木) 14:36:38 Mr.XRAY
▼ takiさん

> CPUの稼働率が低くなって、1秒間ほど入力がなければ、
> 「すみません。保存しますのでちょっと待ってね。」と
> 保存作業が行われるのが理想なのですが。


自動保存というやつですか.
ワードとかエクセルにもありますね.

> つまり、漢字変換とかでCPUが忙しい時でもイベントが
> 呼び出されてしまいます。


ということは,OnIdleが発生しない時というか,時間経過ですね.
う〜ん.どうするんだろう.
OnIdleでフラグでも立てますか.

[1595] Re:自動で保存して欲しいんですが返信 削除
2008/4/4 (金) 05:12:09 junki 〔HomePage
▼ takiさん

> CPUの稼働率が低くなって、1秒間ほど入力がなければ、
> 「すみません。保存しますのでちょっと待ってね。」と
> 保存作業が行われるのが理想なのですが。


お久しぶりです。

Application.OnIdle は、メッセージキューが空になるたびに
呼び出されるので、実は OnIdle と言う名前と違って、断続的に
頻繁に呼び出されます。逆に、アプリが放置されているときは
まったく呼ばれません。

タイマーと GetLastInputInfo API と、保存後に変更されたかどうか
を見られれば、簡単にできますね。

http://homepage1.nifty.com/MADIA/delphi/delphi_bbs/200409/200409_04090033.html

http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=079030




[1597] Re2:自動で保存して欲しいんですが返信 削除
2008/4/4 (金) 16:42:44 taki
▼ junkiさん

> Application.OnIdle は、メッセージキューが空になるたびに
> 呼び出されるので、実は OnIdle と言う名前と違って、断続的に
> 頻繁に呼び出されます。逆に、アプリが放置されているときは
> まったく呼ばれません。


やはり、そうなのですね。

> タイマーと GetLastInputInfo API と、保存後に変更されたかどうか
> を見られれば、簡単にできますね。
>
> http://homepage1.nifty.com/MADIA/delphi/delphi_bbs/200409/200409_04090033.html
>
> http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=079030
>


おお〜っ、なるほど。ありがとうございます。
使っているノートPCがCPUが遅く、漢字変換が追いつかない位なのです。
それでいて、確実に保存もしておきたいし・・・。

これでうまくいきそうです。(^^♪

[1599] Re3:自動で保存して欲しいんですが返信 削除
2008/4/6 (日) 09:46:03 taki
自己レスです。

junkiさんに教えていただいた方法でうまく保存できるようになりました。
今回の問題は解決したのですが、CPUの稼動率が気になっています。

調べてみると、GetSystemTimes(GetSystemTimeではありません)が
CPUのIdleTimeを返すAPIだそうです。(Vista or WinXP SP1以降)
msdnに載っています。

しかし、私のDelphiは知らないと言っています。
新しいAPIなのか?まだ未定義みたいです。残念!

[1616] Re4:自動で保存して欲しいんですが返信 削除
2008/4/18 (金) 17:07:32 taki
 自己レスです。

しつこく GetSystemTimes ですが、サンプルを見つけたので
プログラムしてみました。
内容は?です。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Timer1: TTimer;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

var
  oit,nit,okt,nkt,oust,nust:Double;

implementation

{$R *.dfm}

function GetSystemTimes(var lpIdleTime:FileTime; var lpKernelTime: FileTime;
         var lpUserTime: FileTime): Boolean; stdcall;external 'Kernel32.dll';


function FileTime2Double(FileT: FileTime): Double;
begin
  Result := FileT.dwHighDateTime* 4.294967296E9 + FileT.dwLowDateTime;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  oit := 0.0;
  nit := oit;
  okt := oit;
  nkt := oit;
  oust := oit;
  nust := oit;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  IdleTime,KernelTime,UserTime:FILETIME;
begin
  GetSystemTimes(IdleTime,KernelTime,UserTime);
  nit := FileTime2Double(IdleTime);
  nkt := FileTime2Double(KernelTime);
  nust := FileTime2Double(UserTime);
// 1秒間のそれぞれの使用された時間
  oit  := nit  - oit;
  okt  := nkt  - okt;
  oust := nust - oust;
// IdleTime,KernelTime,UserTimeの関係が今ひとつ分かりません
  Edit1.Text := FloatToStr(oit/(oit+okt+oust)*100);
  Edit2.Text := FloatToStr(okt/(oit+okt+oust)*100);
  Edit3.Text := FloatToStr(oust/(oit+okt+oust)*100);
  oit  := nit;
  okt  := nkt;
  oust := nust;
end;

end.


INCM/CMT
Cyclamen v3.82