PDA

View Full Version : اجرای همزمان دوکار



r_khan
دوشنبه 05 اسفند 1392, 09:54 صبح
سلام
در برنامه ام از دستوراتی برای اپدیت دیتابیس هر 10 دقیقه استفاده میکنم. حال اگه در حین اینکه نوبت به اجرای دستور اپدیت رسید و دستور اپدیت در حال اجرا می باشد. کاربر در همان لحظه رو دکمه ای کلیک یا داخل تکس باکس در حال نوشتن باشد . در کار کاربر اختلال ایجاد میشود. یعنی فرایند کلیک کردن یا نوشتن متوقف میشود .
ایا راه حلی برای برطرف کردن این مشکل وجود دارد؟

jafaripur
دوشنبه 05 اسفند 1392, 10:01 صبح
باید با برنامه نویسی چند نخی استفاده کنی ( Multi Thread )

r_khan
دوشنبه 05 اسفند 1392, 10:14 صبح
باید با برنامه نویسی چند نخی استفاده کنی ( Multi Thread )

ممنون میشم بیشتر توضیح بدهید

jafaripur
دوشنبه 05 اسفند 1392, 11:24 صبح
فکر کنم خیلی واضح گفتم!

smemamian
دوشنبه 05 اسفند 1392, 11:28 صبح
ممنون میشم بیشتر توضیح بدهید

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

واسه اینکه یه کم بیشتر باهاش درگیر بشی : تمامی فرایندها(رخدادها، کاربا ویوها و...) در هر زبان برنامه نویسی روی یک نخ یا همون Thread صورت میگیره که به این نخ، نخ اصلی یا نخ ریشه میگن. این نخ در هر لحظه زمان می تونه خودش رو درگیره یه کار بکنه که اگر زمان استفاده یک کار از این نخ بیش از 5 ثانیه بشه (در آندروید)همون خطای رایج رو خواهید دید : Application Not Responding
به صورت مخفف ANR.
برای رفع این مشکل باید از نخ/ها استفاده کنی. با یک شکل ساده ای که کشیدم راحت تر میفهمی :
http://upload7.ir/imgs/2014-02/06993318158169154080.jpg

همین طور که می بینی نخ اصلی که سیستم خودش این نخ رو ایجاد می کنه باید با صفحه در ارتباط باشه.
نخ های فرعی که شما ایجاد می کنی ممکن هست با این نخ اصلی در ارتباط باشن و ممکن هست نباشن !

گاهی 2 نخ به صورت موازی باهم این کاری می کنن گاهی هم ممکن هست نخی اصلاً نیازی ارتباط با UI یا همون
رابط کاربری(صفحه نمایش) نداشته باشه. نخ 3 و 4 که دایره دورش کشیدم کاری با UI ندارند ولی چون درحال انجام
پردازش هستند باید ایجاد شوند.

r_khan
دوشنبه 05 اسفند 1392, 12:22 عصر
این کدی که من نوشتم
فکر کنم از نخ اصلی استفاده میکنه .چطور تبدیل به نخ فرعی کنم



Handler Handlcus = new Handler();
runcus = new Java.Lang.Runnable(() =>
{


this.RunOnUiThread(new Java.Lang.Runnable(() =>
{
Toast.MakeText(this,"در حال بروز رسانی ...",ToastLength.Short).Show();


UpdateTable update = new UpdateTable ();
var upcus=update.sendCustomer();


var groupcust=update.updateCustomerGroup ();
var cus=update.updateCustomer ();




if (cus == "موفق" && groupcust == "موفق")
{


Toast.MakeText(this,"با موفقیت بروز رسانی شد",ToastLength.Short).Show();
}
else
{
Toast.MakeText(this,"بروز رسانی نا موفق ",ToastLength.Short).Show();


}


}));
Handlcus.RemoveCallbacks(runcus);
Handlcus.PostDelayed(runcus, TimeCus);
});


Handlcus.PostDelayed(runcus, TimeCus);

r_khan
دوشنبه 05 اسفند 1392, 14:36 عصر
دستور


this.RunOnUiThread(new Java.Lang.Runnable(() =>

{ }));
اضافه بود
با برداشتن ان دیگر مشکل همزمانی رخ نمیدهد.