Saturday, February 03, 2007

Mengheningkan Cipta

Hmm .. akhirnya seorang dari kami harus berkorban. Akhirnya seorang dari kami harus memasang muka seolah tidak terjadi apa-apa padahal sebenarnya sedang menanggung suatu beban perasaan yang menekan sangat berat. Akhirnya seorang dari kami harus mencoba tersenyum untuk menutupi hatinya yang kecewa. Akhirnya seorang dari kami menjadi bingung dan tidak tahu harus berbuat apa karena tidak tanggap membaca situasi, tidak mau mengoreksi diri, dan tidak mau belajar untuk meningkatkan kualitas dirinya.

Kasihan memang. Tapi apa daya semua sudah terjadi. Semua sudah ada yang mengatur. Rejeki bukan hanya di sini. Semoga lebih sukses di masa depan. Selamat jalan om. Sampai berjumpa.

Monday, January 29, 2007

Timer Dengan Interval Kurang Dari 1 milidetik


Beberapa minggu yang aku buat timer yang intervalnya bersatuan microsecond (mikrodetik) atau 1/1000 milisecond (ms). Waktu itu ada yang mau mengakusisi data dari hardware yang butuh timer dengan interval di bawah 1 ms. Aku coba share di sini, siapa tahu bisa membantu lebih banyak orang. Oh ya, bahasa yang dipakai adalah Delphi. Class-nya aku beri nama THighPrecTimer.



unit classHighPrecTimer;

interface

uses Classes, Messages, Windows;

type
THighPrecTimer = class(TComponent)
private
FInterval: Int64;
FEnabled: Boolean;
FFrequency: Int64;
FPeriod: Real;
FOnTimer: TNotifyEvent;
FWndHandle: HWND;
procedure SetEnabled(Value: Boolean);
procedure TimerProcHandle;
procedure WndProc(var Msg: TMessage);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;

property Interval: Int64 read FInterval write FInterval;
property Enabled: Boolean read FEnabled write SetEnabled;
property OnTimer: TNotifyEvent read FOnTimer write FOnTimer;
end;

const
IN_MICRO_SECOND = 1000000;
WM_PACER = WM_USER+202;

implementation

uses Forms, Dialogs, Variants;

{ THighPrecTimer }

constructor THighPrecTimer.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
QueryPerformanceFrequency(FFrequency);
FPeriod := 1/FFrequency;
FInterval := 1000;
FWndHandle := AllocateHWnd(WndProc)
end;

destructor THighPrecTimer.Destroy;
begin
DeallocateHWnd(FWndHandle);
inherited Destroy;
end;

procedure THighPrecTimer.SetEnabled(Value: Boolean);
begin
FEnabled := Value;
if FEnabled then
TimerProcHandle;
end;

procedure THighPrecTimer.TimerProcHandle;
var
timeTaken, startTick, stopTick: Int64;
tickTaken: Int64;
begin
QueryPerformanceCounter(startTick);
{$IFDEF WIN32}
SetPriorityClass(GetCurrentProcess,REALTIME_PRIORITY_CLASS);
{$ENDIF}
while FEnabled do
begin
QueryPerformanceCounter(stopTick);
tickTaken := stopTick-startTick;
timeTaken := Round((tickTaken)*FPeriod*IN_MICRO_SECOND);
if (timeTaken >= FInterval) and Assigned(FOnTimer) then
begin
FOnTimer(Self);
QueryPerformanceCounter(startTick);
end;
Application.ProcessMessages;
end;
{$IFDEF WIN32}
SetPriorityClass(GetCurrentProcess, NORMAL_PRIORITY_CLASS);
{$ENDIF}
end;

procedure THighPrecTimer.WndProc(var Msg: TMessage);
begin
with Msg do
begin
if Msg = WM_PACER then
try
TimerProcHandle;
except
Application.HandleException(Self);
end
else
Result := DefWindowProc(FWndHandle, Msg, wParam, lParam);
end;
end;

end.



O ya, THighPrecTimer belum dijadikan design time component, jadi harus digunakan waktu runtime. Seperti ini:


unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
FTimer: THighPrecTimer;
FCounter: Int64;
procedure TimerProcHandler(Sender: TObject);
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
FTimer := THighPrecTimer.Create(nil);
FTimer.OnTimer := TimerProcHandler;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
FTimer.Enabled := false;
end;

procedure TForm1.TimerProcHandler(Sender: TObject);
begin
{ Letakkan rutin yang dieksekusi pada saat OnTimer di sini. Contohnya seperti 2 baris perintah di bawah ini. }

Inc(FCounter);
Caption := VarToStr(FCounter);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
FCounter:= 0;
FTimer.Interval := 1000; // ini dalam satuan microdetik
FTimer.Enabled := true;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FTimer.Enabled := false;
end;

end.



Semoga bisa membantu yang sedang memerlukan. Kalau ada yang mau merevisi atau memodifikasi silakan saja.

Friday, January 26, 2007

Akhirnya

Dan pada akhirnya, aku mengetikkan sesuatu juga ke BLOG ini. Well, hari ini adalah hari ke 18 aku ada di Bali. Tepatnya sejak 10 January 2007. Ngga kerasa... Ngga taunya udah lebih setengah bulan juga aku ninggalin Jakarta. Emang bener, ngga ada yang tau apa yang akan terjadi besok.

Seperti sebelum aku ke Jakarta awal tahun 2006 lalu, wew! Siapa sangka aku bakal ke sana? Jakarta salah satu kota yang masuk dalam daftar hitamku. Kota yang keras, panas, dan penuh sesak manusia. Eh, ternyata aku sampai juga ke sana. Dan ternyata juga, semua yang aku jalani sekarang berawal dari situ. Sama seperti awal ke Jakarta, ngga sangka kalau sekarang aku ada di Bali.

Hmm .. setelah dari sini (Bali), selanjutnya aku bakal kemana lagi yha?