Döngüyü gerekince durduramıyorum.
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Döngüyü gerekince durduramıyorum.
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.?
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.?
Re: Döngüyü gerekince durduramıyorum.
durdurma butonuna bastığınızı program algılamıyor olabilir, döngü içinde application.processmessages kullandınız mı?
şeklinde çalışması lazı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;
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...

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...

Re: Döngüyü gerekince durduramıyorum.
unicorn64 yazdı:durdurma butonuna bastığınızı program algılamıyor olabilir, döngü içinde application.processmessages kullandınız mı?
şeklinde çalışması lazı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;
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?
Re: Döngüyü gerekince durduramıyorum.
o zaman
ş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)
Kod: Tümünü seç
for...
begin
Application.ProcessMessages;
if durdur then
break;
....
....
end;
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...

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...

Re: Döngüyü gerekince durduramıyorum.
unicorn64 yazdı:o zaman
şeklinde de çalışır, nitekim bi çok kez kullandım bu şekilde...Kod: Tümünü seç
for... begin Application.ProcessMessages; if durdur then break; .... .... end;
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.
Re: Döngüyü gerekince durduramıyorum.
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...

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...

Re: Döngüyü gerekince durduramıyorum.
İ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..unicorn64 yazdı:o zaman kodlarınızı görmekte fayda var... gözünüzden kaçan birşey vardır belki...
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;
Re: Döngüyü gerekince durduramıyorum.
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.