Döngüyü gerekince durduramıyorum.

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
neu84
Üye
Mesajlar: 307
Kayıt: 06 Oca 2011 11:27

Döngüyü gerekince durduramıyorum.

Mesaj gönderen neu84 »

S.a arkadaşlar,
içinde binlerce kaydı olan bir TstringList düşünün, onun içinde bir döngü ile her indexinde bir kelime arıyorum, yazen her bir elemanı bir kelimeden oluşuyor. Ancak butona tıkladıgımda işlem başlıyor 40000 tane veri var dersek eger her biri için iterasyon dönüyor. Ancak ben bazen çok uzun sürecegini düşünüp işlemi iptal et gibi bir buton kullanmak istiyorum, ancak ne yaptıysam bu döngüyü durduramadım, içine boolean degişken yolladım o degişkene göre true ise break, exit hepsini denedim çıkması için döngüden ancak olmadı.. Önerileriniz nedir bu soru için.?
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: Döngüyü gerekince durduramıyorum.

Mesaj gönderen unicorn64 »

durdurma butonuna bastığınızı program algılamıyor olabilir, döngü içinde application.processmessages kullandınız mı?

Kod: Tümünü seç


var   //global var bloğu
  durdur:boolean;
  
procedure TForm1.BaslaClick(Sender:TObject)
var
 i:integer;
begin

   i:=0;
  
   durdur:=false; 

   while ((i<liste.count) and (durdur=false))
   begin
   
      //işlemler
      i:=i+1;
      application.processmessages;
   end;
end;


procedure TForm1.DurdurClick(Sender:TObject)
begin
 durdur:=true;
 application.processmessages;
end;

şeklinde çalışması lazım...
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
neu84
Üye
Mesajlar: 307
Kayıt: 06 Oca 2011 11:27

Re: Döngüyü gerekince durduramıyorum.

Mesaj gönderen neu84 »

unicorn64 yazdı:durdurma butonuna bastığınızı program algılamıyor olabilir, döngü içinde application.processmessages kullandınız mı?

Kod: Tümünü seç


var   //global var bloğu
  durdur:boolean;
  
procedure TForm1.BaslaClick(Sender:TObject)
var
 i:integer;
begin
   i:=0; 
   durdur:=false; 
   while ((i<liste.count) and (durdur=false))
   begin
      //işlemler
      i:=i+1;
      application.processmessages;
   end;
end;


procedure TForm1.DurdurClick(Sender:TObject)
begin
 durdur:=true;
 application.processmessages;
end;

şeklinde çalışması lazım...

Tşk ederim cevap için.. Evet application progress kullandım, for döngüsü kullanıyorum, for döngüsünün blogunun başında kullanıyorum

Kod: Tümünü seç

  for...
  begin
   Application.ProcessMessages;
   ....
  ....
  end;

Gibi... Bu arada for ile while arasında performans açısından bir fark varmı sizce?
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: Döngüyü gerekince durduramıyorum.

Mesaj gönderen unicorn64 »

o zaman

Kod: Tümünü seç

for...
begin
   Application.ProcessMessages;
   if durdur then
      break; 
   ....
   ....
  
end;
şeklinde de çalışır, nitekim bi çok kez kullandım bu şekilde...

for ile while arasında gözle görülür bir fark görmedim, yada dikkat etmedim bilemiyorum, ama sonuçta işlem yerleri değişse de yapılanlar aynı... (değişkenin değerini arttırma, değerini kontrol etme)
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
neu84
Üye
Mesajlar: 307
Kayıt: 06 Oca 2011 11:27

Re: Döngüyü gerekince durduramıyorum.

Mesaj gönderen neu84 »

unicorn64 yazdı:o zaman

Kod: Tümünü seç

for...
begin
   Application.ProcessMessages;
   if durdur then
      break; 
   ....
   ....
  
end;
şeklinde de çalışır, nitekim bi çok kez kullandım bu şekilde...

for ile while arasında gözle görülür bir fark görmedim, yada dikkat etmedim bilemiyorum, ama sonuçta işlem yerleri değişse de yapılanlar aynı... (değişkenin değerini arttırma, değerini kontrol etme)

tşk ederim aynen bu şekilde denemiştim ancak iç içe 2 tane for var, ikisinde de bu if kontrolunu koydugum halde hiç umursamadan devam ediyodu.
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: Döngüyü gerekince durduramıyorum.

Mesaj gönderen unicorn64 »

o zaman kodlarınızı görmekte fayda var... gözünüzden kaçan birşey vardır belki...
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
neu84
Üye
Mesajlar: 307
Kayıt: 06 Oca 2011 11:27

Re: Döngüyü gerekince durduramıyorum.

Mesaj gönderen neu84 »

unicorn64 yazdı:o zaman kodlarınızı görmekte fayda var... gözünüzden kaçan birşey vardır belki...
İptalMi diye boolean bi değişkenim var. aynı butonun içinde tanımlıyorum. Analizi iptal etmek içinde aynı butonu kullanmak istiyorum. Böyle bi mantık kurdum. neresi yanlış olabilir sizce? İncelerseniz sevinirim..

Kod: Tümünü seç

 iptalMi:=false;
  if(btnAnaliz.Caption='Analizi Başlat')then
  begin
    btnAnaliz.Caption:='Analizi İptal Et';
    iptalMi:=false;
  end
  else
  if(btnAnaliz.Caption='Analizi İptal Et')then
  begin
    btnAnaliz.Caption:='Analizi Başlat';
    iptalMi:=True;
  end;

  for I := 0 to Memo1.Lines.Count - 1 do 
    begin
      Application.ProcessMessages;
      if(iptalMi)then
          begin
            break;
          end;
       for L := 0 to strList.Count - 1 do
        begin
         if(iptalMi)then
          begin
            break;
          end;
        if(Memo1.Lines.Count=I)then begin exit; end;
        if(strList.Strings[L]=TRIM(Memo1.Lines.Strings[I]))then
          begin
          zatenVarOlanKayitListesi.Add(TRIM(Memo1.Lines.Strings[I]));
          lblEslesenKayitSayisi.Caption:=IntToStr(zatenVarOlanKayitListesi.Count);
          break;
          end;
   end;
orhancc
Üye
Mesajlar: 585
Kayıt: 24 Ağu 2010 02:14
Konum: İstanbul / Kadıköy
İletişim:

Re: Döngüyü gerekince durduramıyorum.

Mesaj gönderen orhancc »

Basit bir örnek belki işe yarar.2 düğme bir tane label ekle formuna.

Kod: Tümünü seç

unit Unit4;

interface

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

type
  TForm4 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form4: TForm4;
  Durdur :Boolean;
  sayac:Cardinal;

implementation

{$R *.dfm}

procedure TForm4.Button1Click(Sender: TObject);
var
 i:Cardinal;
begin

  for i := sayac to 10000000 do
     begin
       if durdur then
         begin
           durdur := false;
           break;
         end;

       Label1.Caption := Format('%d',[i]);
       Application.ProcessMessages;
     end;
   sayac := i;
end;

procedure TForm4.Button2Click(Sender: TObject);
begin
  Durdur := true;
end;

procedure TForm4.FormCreate(Sender: TObject);
begin
  Sayac := 0;
end;

end.

Cevapla