PDA

View Full Version : حرفه ای: کار با ListView در Thread



r0ot$harp
پنج شنبه 13 مرداد 1390, 23:47 عصر
سلام دوستان عزیز .

من یه Thread دارم که می خوام چک کنم یه عبارتی توی آیتم های ListView وجود داره یا نه . تاحالا این کار رو نکردم . با delegate هم نتونستم . ممنون می شم کمک کنید .


باتشکر احسان

Esmail Solhkhah
جمعه 14 مرداد 1390, 02:18 صبح
Control.CheckForIllegalCrossThreadCalls رو تو MSDN یه نگاهی بکنید.

موفق باشید.

r0ot$harp
جمعه 14 مرداد 1390, 02:55 صبح
Control.CheckForIllegalCrossThreadCalls رو تو MSDN یه نگاهی بکنید.

موفق باشید.
دوست عزیز این روش در .net 1 بود و الان به دلایل زیادی استفاده نمی شه . مهمترین دلیلش اتفاق های غیر قابل پیش بینی هست .


باتشکر احسان

Esmail Solhkhah
جمعه 14 مرداد 1390, 03:17 صبح
ممنون از پاسختون

میشه بفرمایید رفرنستون برا این جواب چیه

چون بنده تو MSDN و MSDN Online چیزی تو این مورد ندیدم

badguy
جمعه 14 مرداد 1390, 03:22 صبح
delegate bool checkerDelegate(ListBox listBox, String context);
bool CheckContextInListBox(ListBox listBox, String targetContext)
{
if (listBox.InvokeRequired)
{
return Convert.ToBoolean(listBox.Invoke(new checkerDelegate(CheckContextInListBox), new object[] { listBox1, targetContext }));
}
else
{
foreach (var i in listBox.Items)
if (i.ToString().Contains(targetContext))
return true;
}
return false;
}

r0ot$harp
جمعه 14 مرداد 1390, 13:24 عصر
ممنون از پاسختون

میشه بفرمایید رفرنستون برا این جواب چیه

چون بنده تو MSDN و MSDN Online چیزی تو این مورد ندیدم

والا دوست عزیز بنده دونبال رفرنس نرفتم . هم خودم به این نتیجه رسیدم که وقتی ما توی Thread دیگه هستیم و قصد ارتباط با Thread دیگه ای داریم خوب این کار موجب در هم پیچیدگی در Thread ها می شود .

و هم جناب مهدی موسوی مدیر کل سایت :

http://barnamenevis.org/showthread.php?73406-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%AF%D9%88-thread-%D8%AF%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87&p=369771&viewfull=1#post369771

r0ot$harp
جمعه 14 مرداد 1390, 13:28 عصر
delegate bool checkerDelegate(ListBox listBox, String context);
bool CheckContextInListBox(ListBox listBox,String targetContext)
{
if(listBox.InvokeRequired)
{
listBox.Invoke(new checkerDelegate(CheckContextInListBox),new object[]{listbox,targetContext});
}
else
{
foreach(var i in listBox.Items)
if(i.Contains(targetContex))
return true;
return false;
}
}

ممنون دوست عزیز بابت پاسختون .

دوست عزیز در ضمن کد شما چند مورد ایراد داره .

باتشکر احسان

badguy
جمعه 14 مرداد 1390, 15:17 عصر
ممنون از تذکر , منطق کارش درسته بعد ارسال متوجه ایراد کد شدم که حوصلم نیومد درستش کنم, مهم منطقش بود:چشمک:

badguy
جمعه 14 مرداد 1390, 15:45 عصر
ممنون دوست عزیز بابت پاسختون .

دوست عزیز در ضمن کد شما چند مورد ایراد داره .

باتشکر احسان
حل شدن:لبخندساده:

r0ot$harp
جمعه 14 مرداد 1390, 16:23 عصر
مشکلی که من دارم تو کد زیر توضیح می دم :

private static bool da(ListView lv, string Name, string Address, string ClassType)
{
bool State = false;
try
{
if (lv.InvokeRequired)
{

lv.Invoke(new DAdd(da), new object[] { lv, Name, Address, ClassType });
return State;
}
else
{
State = true;

}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return State;
}

زمانی که lv.Invoke(new DAdd(da), new object[] { lv, Name, Address, ClassType }); فراخوانی می شود : Delegate اجرا و da دوباره اجرا می شود و این بار به قسمت Else می رود .

در این قسمت State = true; می شود . تا اینجا همه چی درست هست و خط آخر اجرا می شود return State; .

بعد از اجرا شدن خط آخر و برگشت true دوباره da فراخوانی می شود و این بار مقدار False رو برمی گردونه .

مشکل در اینجاست دقیقا ...

این تابع باید فقط True برگردونه اما همیشه False بر می گردونه .
باتشکر احسان

badguy
جمعه 14 مرداد 1390, 16:29 عصر
بله اون قسمت کد درست شدو یه بار دیگه به کدی ارسالی من نگا کنید[ در ضمن منطق شما اشتباه است شما یک متغییر به صورت local در تابع گذاشتید این تابع بع صورت بازگشتی فراخونی میشه که اگر State در مرحله 2 تغییر پیدا کنه لزوما در مرحله 1 فراخونی بازگشتی تغییر نمیکنه ,و اگر این تابع را در یک Thread فراخونی کنید همیشه مقدار False رو بر خواهد گرداند ]
فک کنم ایراد کار شما اینجا که دقیقا متوجه عملکرد تابع Invoke در اینجا نشدد؟

r0ot$harp
جمعه 14 مرداد 1390, 16:35 عصر
بله اون قسمت کد درست شدو یه بار دیگه به کدی ارسالی من نگا کنید[ در ضمن منطق شما اشتباه است شما یک متغییر به صورت local در تابع گذاشتید این تابع بع صورت بازگشتی فراخونی میشه که اگر State در مرحله 2 تغییر پیدا کنه لزوما در مرحله 1 فراخونی بازگشتی تغییر نمیکنه ,و اگر این تابع را در یک Thread فراخونی کنید همیشه مقدار False رو بر خواهد گرداند ]
فک کنم ایراد کار شما اینجا که دقیقا متوجه عملکرد تابع Invoke در اینجا نشدد؟
ممنون از شما . ایراد کارم که اصلا حواسم بهش نبود در Convert.ToBoolean بود .

ممنون از شما که این قسمت رو یاد آوری کردین . من تا الان کار زیادی با Thread ها نکردم . واسه همین زیاد مسلط به این موضوع نیستم .

باتشکر احسان