C# Thread I Duraklatmak / Devam Ettirmek
-
Merhabalar , c# express edition kullanıyorum. Malum vs kasıyor. Neyse gelelim sorumuza.
Bir thread kullanıyorum . Thread da uzun bir döngüye sokuyorum. Yapılacak işlem biraz uzun sürdüğü için kullanıcıya da pause / resume
gibi bir imkan tanımak istiyorum. thread.suspend(); ve thread.resume(); var ama bunlar deprecated yani iptal edilmiş durumdalar. Onları kullanamıyorum.
nette biraz araştırdım işime yarıyacak birşey bulamadım. :/ nasıl yapabileceğimi bilen varmı -
aklıma gelmişken şöyle birşey denedim.
dursammi=false diye bir değişken tanımladım bool cinsinden.
thread ın işlettiği fonksiyonun içine döngünün başlangıcının hemen altına if(dursammi == false){ işlemler} diye yazdım. Pause butonuna da
private void button2_Click(object sender, EventArgs e)
{
if(dursammi == false)
{
dursammi=true;
button2.Text = "Devam";
}
else // zaten bekliormşm
{
dursammi = false;
button2.Text = "Duraklat";
}
}
yaptım. Sonra threadı başlatınca duraklata basıyorum işlemler duruyor. Ama devam et butonuna basınca kaldığı yerden devam etmiyor -
Selam h4ckinger, şöyle bir şey yapabilirsin
Thread ile çalışacak fonksiyonları bis class ta topla ve class ının içinde Run prosedürü olsun. (Threadi çalıştırmak için) (Mesela ThreadObject.cs diyelim)
Ayrıca Run prosedürünün içinde sanırım döngün falan var, buradaki değişkenleri class ın başına public olarak tanımla ki müdahale edebilesin.
Şimdi thread i çalıştırdığın yerde şöyle bir şey yapacaksın, emin değilim çalışırmı çalışmazmı;
Thread th;
public List threadList;
void baslat_butonu()
{
if(this.threadList !=null && this.threadList.Count>0)
{
foreach(ThreadObject to in this.threadList)
{
ThreadObject refObj = to;
th = new Thread(new ThreadObject(refObj.Run));
refObj.thread = th;
th.Start();
}
threadList.Clear();
}
else
{
ThreadObject = to = new ThreadObject();
th = new Thread(new ThreadStart(to.Run)); // Burada emin değilim böyleydi sanırım, kafadan yazıyorum
to.i=0;
to.site="http://www.mynet.com";
to.thread = th;
to.obj = this;
th.Start();
}
}
void duraklat_butonu()
{
lock(this.threadList)
{
foreach(ThreadObject to in this.theadList)
{
to.Durdur();
}
}
}
/////////////////////////
// ThreadObject classi
public int i;
public Thread myThead;
public string site;
public object obj;
public void Run()
{
//calıstırılacakkodlar
//ornek dongu
for(i=0;i<80;i++) // buradaki i yukarıdan gelmekte global
{
//Saldir(site);
}
}
public void Durdur()
{
lock(this)
{
obj.threadList.Add(this);
//Burada durduralım
this.myThread.Abort();
}
}
-
volticim slm, başlat ve durdur butonlarım var ama istediğim şu bir duraklatma butonu olucak basınca duraklıyacak thread , sonra devam butonuna basınca kaldığı yerden devam edicek. Durdurma olayını thread.abort(); ile yapıyorum da duraklatmayı beceremedim : (
-
h4ckingercım kodu düzenledim, thread başlatıyor ve duraklatıyor,
-
ento nerden çıktı şimdi :D
akşam deniyecem şimdi çıkmam lazım , bide kodlara baktım da şöylece . Duraklattıktan sonra nasıl devam ettiricez :D -
sabah sabah thread kodu yazdırırsan böyle olur :) durdurduktan sonra başlata basarsan devam eder, eğer başlata durdurmadan basarsan başlar .d filozofik oldu
-
yav şimdi burda sen yine abort kullanmışsın o komple bitirmek için değil mi ?
bide burdaki lock(this) ne işe yarar biraz açar mısın . Bu ara pis merak saldım c# :E
public void Durdur()
{
lock(this)
{
//Burada durduralım
this.myThread.Abort();
}
}
-
şimdi orada abort ederek threadi tamamen öldürüyorum, ama thread in aktif değerleri hala duruyor, threadList in içinde, lock ise bir nesneye birden fazla thread in ulaşmasını engellemek için kullanılır
-
neden o kadar kastınız anlamadım :)
thread.abort() iptal eder geri dönüşü yok
thread.suspend() pause eder
thread.resume() kaldığı yerden devam ettirir
tabi mesela şöyle bişi olabilir sen durdurmuşken(yani abort etmişken) resume dersen program patlayacaktır bunlarıda göz önünde bulundur.
if'ler yardımıyla yaparsın
not: umarım threadi global olarak tanıtıyorsundur :)
-
fakat h4ckinger suspend ve resume a ulaşamadığını söylemiş, benim yaptığım farklı bir açıdan yaklaşmak