salise bazında süre farkı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
takkus
Üye
Mesajlar: 25
Kayıt: 18 Şub 2005 03:53
İletişim:

salise bazında süre farkı

Mesaj gönderen takkus »

merhaba,
bir takım problemlerin çözümü için hazırlanan programda problemlerin çözüm sürelerini hesaplamam gerekiyor.
viewtopic.php?t=2503&highlight=time
başlığı altındaki gibi decodetime fonksiyonunu kullanarak saliseyi almaya çalışıyorum. ama dönen değer time fonksiyonunu getirdiği değerden farksız.

Kod: Tümünü seç

for i:=1 to strtoint(edit7.text) do
  for j:=1 to strtoint(edit16.text) do
  begin
    oan:=now;
    decodetime(oan,saat, dakika, saniye, salise);
    basla[j-1]:=(oan);

// diğer işlemler

    oan:=now;
    decodetime(oan, saat, dakika, saniye, salise);
    bitir[j-1]:=(oan);
    temptime:=bitir[j-1]-basla[j-1];
    islemsureleri[j-1]:=timetostr(temptime);
  end;
bu kodlar doğru sonucu veriyor ama saniye bazında ve benim işimi görmüyor çünkü işlem saniyenin altında bir sürede sona eriyor. buna rağmen göz ardı edilemez. :!:
bu kodlarda yaptığım yanlış nedir? ya da süreyi hesaplamak için farklı bir fikriniz var mı?
şimdiden teşekkürler.
metinkorkmaz
Üye
Mesajlar: 46
Kayıt: 25 May 2005 09:08
Konum: izmir

Mesaj gönderen metinkorkmaz »

Gettickcount u kullanabilirsin. Milisaniye cinsinden, yani saniyenin binde biri deger geri döndürecektir. Sanırım işini görür.

Kod: Tümünü seç

...
var
  gecensure : longword;
begin
   gecensure:=gettickcount;
  ....
   işlemler
   ....
   gecensure:=gettickcount - gecensure; 
   // gecen  süre islemlerin ne kadar sürdügünü milisaniye cinsinden tutacaktır.
   ....
takkus
Üye
Mesajlar: 25
Kayıt: 18 Şub 2005 03:53
İletişim:

Mesaj gönderen takkus »

cevabınız için teşekkür ederim. gettickcount fonksiyonunu deneyip adım adım ilerlediğimde sonucu veriyor. fakat derleyip exesini denediğimde bu işlem sonucunda da dönen değer 0 oluyor. bir anlam veremedim. sanırım bu fonksiyon sistem zamanıyla ilgilenmiyor. kodları veriyim fikir vermesi açısından.

Kod: Tümünü seç

begin 
var basla,bitir :array of longword; temptime:longword; islemsureleri: array of string;
for i:=1 to strtoint(edit7.text) do
  for j:=1 to strtoint(edit16.text) do
  begin
    basla[j-1]:=(gettickcount);  //önceden decodetime fonksiyonuyla ilgili codelar vardı.
    rulet;            //
    caprazlama;   //buradaki procedürler diğer işlemleri yapıyorlar ve içiçe döngüler içeriyorlar
    mutasyon;      //
    quicksort(0,length(isdizisi)-1);
    setlength(isdizisi,popcount, issayisi+2);
    progressbar1.Position :=i;
    for k:=0 to issayisi+1 do
       eniyiler[l,k]:=isdizisi[0,k];   
    eniyiler[l,issayisi+2]:=j; 
    eniyiler[l,issayisi+3]:=i; 
    inc(l);
    temptime:=bitir[j-1]-basla[j-1];
    tempsalise:=temptime div 100;
    islemsureleri[j-1]:=inttostr(tempsalise);
farklı şeyler de deniyorum ama bi türlü saliseyi yakalıyamadım :cry:
tekrar teşekkürler
metinkorkmaz
Üye
Mesajlar: 46
Kayıt: 25 May 2005 09:08
Konum: izmir

Mesaj gönderen metinkorkmaz »

Gettickcount windows başladıktan sonra geçen süreyi milisaniye cinsinden verir. Bilgi longword de tutuldugundan 47 gün sonra sistem yeniden 0 a döner.

Yanlış olan burası:
temptime:=bitir[j-1]-basla[j-1]; // her zaman 0 verir.
şöyle olmalıydı:
temptime:=gettickcount-basla[j-1];

Daha sonra böyle devam edersin:
tempsalise:=temptime div 100;
islemsureleri[j-1]:=inttostr(tempsalise);

Fakat bitir[j-1] yerine gecici bir degiskende kullanabilirsin.

Kod: Tümünü seç


var
 basla,bitir :array of longword; temptime:longword; 
islemsureleri: array of string;
begin
for i:=1 to strtoint(edit7.text) do
  for j:=1 to strtoint(edit16.text) do
  begin
    temptime:=gettickcount;
    rulet;            //
    caprazlama;   //buradaki procedürler diğer işlemleri yapıyorlar ve içiçe döngüler içeriyorlar
    mutasyon;      //
    quicksort(0,length(isdizisi)-1);
    setlength(isdizisi,popcount, issayisi+2);
    progressbar1.Position :=i;
    for k:=0 to issayisi+1 do
       eniyiler[l,k]:=isdizisi[0,k];   
    eniyiler[l,issayisi+2]:=j;
    eniyiler[l,issayisi+3]:=i;
    inc(l);
    temptime:=gettickcount-temptime;
    tempsalise:=temptime div 100;
    islemsureleri[j-1]:=inttostr(tempsalise);

takkus
Üye
Mesajlar: 25
Kayıt: 18 Şub 2005 03:53
İletişim:

Mesaj gönderen takkus »

cevabınız için özellikle de kod yazarak açıkladığınız için teşekkür ederim.
kodlar çalışıyor, farklı bir yöntemle daha sonuca ulaştım. ancak ben bunları bir sonraki adımda gride yazdırıyorum ve bu yazdırma adımına break point koyup süreleri kontrol ettiğimde ikisinin de aynı olduğunu görüyorum. ta ki döngü değerlerini 50 ve 100'e çıkarana dek. bu durumda işlem süresi 31 salise. yani sanırım işlemler çok hızlı gerçekleşiyor ve i,j değerleri küçükken dönen değer salisenin altında oluyor ve bana da 0 kalıyor :).
tekrar teşekkürler
Cevapla