PDA

View Full Version : سوال: مشکل با استفاده از ترد ها در برنامه



senaps
شنبه 29 مهر 1391, 23:40 عصر
با سلام.... بنده با استفاده از WCF/WPF/Linq به برنامه‌ی کوچیک نوشتم! که وسط کار تو یه قسمت که از ترد ها استفاده کردم گیر افتادم....

مسئله اینه که من میخوام به محض اینکه کاربر از تکست باکس خارج شد، یه تردی اجرا بشه و یه سری عملیات صورت بگیره در حینی که کاربر داره یه کار دیگه میکنه!

حالا داستان چیه:

من یه تکست باکس برای گرفتن نام کاربری دارم... میخوام به محض خروجش از تکست باکس، متدی برای چک کردن یوزر نیم اجرا بشه:

Thread confirmuserthread = new Thread(new ThreadStart( ConfirmUsername));
confirmuserthread.Start();


خوب... حالا این متد کانفریم که من تو ترد اجراش میکنم این کارا رو میکنه::



username = txt_Username.Text; //this will set the username to the txt_username method!
ServiceReference1.Service1Client obj = new ServiceReference1.Service1Client();
// it check's if username is free to use!
if (obj.ConfirmUsername(username))
{
isValidUsername = true;

}
else
{
tblock_UserName.Text = " نام کاربری شما قابل استفاده نمی باشد، لطفا نام کاربری دیگری انتخاب نمایید";
tblock_UserName.Visibility = System.Windows.Visibility.Visible;
tblock_UserName.Text = "";
}


داستان اینه که میاد یوزر نیم رو با دیتابیسم(سرویس) چک میکنه... اگر قبلا وجود داشت، پیغام خطایی رو نشون میده در یک تکست بلاک! اگر هم نه که هیچی یه مقداری رو True میکنه تا من بتونم با بررسیش، در هنگام کلیک باتن ذخیره اقدام به ذخیره‌ی نام کاربری و پسورد بکنم....

(مسئله اینه که من برای نام‌های کاربری یه جدول و برای رمز های عبور یه جدول دارم که بتونم خاصیت هایی مثل تغییر نام کاربری و همچنین رد گیری تغییر پسورد ها و ... رو داشته باشم!!!)

حالا وقتی میخوام از برنامه استفاده بکنم، برنامه الکی ایراد میگیره که متغییر مربوطه در اختیار یه ترد دیگه‌هستش.... در صورتی که اینجوری نیست....

ایرادش هم از اینجاست:

username = txt_Username.Text;

به نظرتون باید چیکار کنم؟! اگر لازم داشتید بگید تا براتون کد ها رو بذارم ولی خوب حجمش بالاست و ممکنه اذیت بشید سر تستش.... هر قسمتی از کد ها هم لازم بود بفرمایید تا ارائه بکنم خدمتتون....

Mahmoud.Afrad
یک شنبه 30 مهر 1391, 03:58 صبح
از طریق ترد دیگه نمیتونید به کنترل های فرم که روی ترد دیگر اجرا میشند دسترسی داشته باشید. شما بعد از اینکه نتیجه بدست آمد توسط یک delegate از ترد اصلی بخواهید پیغام رو بده.
private delegate void myDelegate(bool b);
private string userName;
private bool isValidUsername;

private void txt_Username_Leave(object sender, EventArgs e)
{
userName = txt_Username.Text;

Thread confirmuserthread = new Thread(new ThreadStart(ConfirmUsername));
confirmuserthread.Start();
}
private void ConfirmUsername()
{
if (userName != string.Empty && userName != null)
{
ServiceReference1.Service1Client obj = new ServiceReference1.Service1Client();
isValidUsername = obj.ConfirmUsername(username);

myDelegate del = new myDelegate(setMessage);
this.lblMessage.Invoke(del, isValidUsername);
}
}
private void setMessage(bool flag)
{
if (flag)
{
tblock_UserName.Text = "نام کاربری معتبر است";
}
else
{
tblock_UserName.Text = " نام کاربری شما قابل استفاده نمی باشد، لطفا نام کاربری دیگری انتخاب نمایید";
}
tblock_UserName.Visibility = System.Windows.Visibility.Visible;
}

senaps
یک شنبه 30 مهر 1391, 13:26 عصر
از دلیگیت ها بدم میاد واقعا..... راه حلی غیر از این نیست درسته؟
اگر براتون امکان داره، یه خورده کد های مربوط به دلیگیت رو توضیح میکنین؟ اخه من فقط یکی از کنترل هایی که داره از ترد استفاده میکنه رو اینجا اوردم برای مثال و چندین کنترل دیگه هم دارم رو فرم و باید برا همشون دلیگیت درست بکنم و استفاده بکنم ازش....

اون جاهایی که "" رو تبدیل به نال یا امپتی کردین در خط 14، روش قبلی خودم از چه لحاظی مشکل ایجاد میکرد؟ منظورم اینه که از لحاظ حافظه یا باگ و اینا داره؟ من تو اکثر پروژه هام از نال و امپتی استفاده میکردم ولی سرعت کارم رو با "" بالاتر بردم؟

senaps
دوشنبه 01 آبان 1391, 00:44 صبح
با سلام....
دوست عزیز، روش شما رو تست کردم و متاسفانه مشکل رو حل نمی‌کنه....( البته اصل کد ارائه شده توسط شما رو نتونستم استفاده بکنم و مجبور شدم جاسازی بکنم با رعایت شرایط ساخت دلیگیت توسط شما ولی بازم همون ارور رو میده متاسفانه....
میشه کمی راهنمایی بکنین یا با کمترین تغییر تو کد های خودم انجامش بدین؟ یا اینکه اجباریه اینجوری کد زدن برا دلیگیت؟ متاسفانه تمام منابع در موردش هم سخت توضیح دادن و نمیشه ازشون چیزی فهمید!