View Full Version : حرفه ای: کار با ListView در Thread
r0ot$harp
جمعه 14 مرداد 1390, 00:47 صبح
سلام دوستان عزیز .
من یه Thread دارم که می خوام چک کنم یه عبارتی توی آیتم های ListView وجود داره یا نه . تاحالا این کار رو نکردم . با delegate هم نتونستم . ممنون می شم کمک کنید .
باتشکر احسان
Esmail Solhkhah
جمعه 14 مرداد 1390, 03:18 صبح
Control.CheckForIllegalCrossThreadCalls رو تو MSDN یه نگاهی بکنید.
موفق باشید.
r0ot$harp
جمعه 14 مرداد 1390, 03:55 صبح
Control.CheckForIllegalCrossThreadCalls رو تو MSDN یه نگاهی بکنید.
موفق باشید.
دوست عزیز این روش در .net 1 بود و الان به دلایل زیادی استفاده نمی شه . مهمترین دلیلش اتفاق های غیر قابل پیش بینی هست .
باتشکر احسان
Esmail Solhkhah
جمعه 14 مرداد 1390, 04:17 صبح
ممنون از پاسختون
میشه بفرمایید رفرنستون برا این جواب چیه
چون بنده تو MSDN و MSDN Online چیزی تو این مورد ندیدم
badguy
جمعه 14 مرداد 1390, 04: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, 14: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, 14: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, 16:17 عصر
ممنون از تذکر , منطق کارش درسته بعد ارسال متوجه ایراد کد شدم که حوصلم نیومد درستش کنم, مهم منطقش بود:چشمک:
badguy
جمعه 14 مرداد 1390, 16:45 عصر
ممنون دوست عزیز بابت پاسختون .
دوست عزیز در ضمن کد شما چند مورد ایراد داره .
باتشکر احسان
حل شدن:لبخندساده:
r0ot$harp
جمعه 14 مرداد 1390, 17: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, 17:29 عصر
بله اون قسمت کد درست شدو یه بار دیگه به کدی ارسالی من نگا کنید[ در ضمن منطق شما اشتباه است شما یک متغییر به صورت local در تابع گذاشتید این تابع بع صورت بازگشتی فراخونی میشه که اگر State در مرحله 2 تغییر پیدا کنه لزوما در مرحله 1 فراخونی بازگشتی تغییر نمیکنه ,و اگر این تابع را در یک Thread فراخونی کنید همیشه مقدار False رو بر خواهد گرداند ]
فک کنم ایراد کار شما اینجا که دقیقا متوجه عملکرد تابع Invoke در اینجا نشدد؟
r0ot$harp
جمعه 14 مرداد 1390, 17:35 عصر
بله اون قسمت کد درست شدو یه بار دیگه به کدی ارسالی من نگا کنید[ در ضمن منطق شما اشتباه است شما یک متغییر به صورت local در تابع گذاشتید این تابع بع صورت بازگشتی فراخونی میشه که اگر State در مرحله 2 تغییر پیدا کنه لزوما در مرحله 1 فراخونی بازگشتی تغییر نمیکنه ,و اگر این تابع را در یک Thread فراخونی کنید همیشه مقدار False رو بر خواهد گرداند ]
فک کنم ایراد کار شما اینجا که دقیقا متوجه عملکرد تابع Invoke در اینجا نشدد؟
ممنون از شما . ایراد کارم که اصلا حواسم بهش نبود در Convert.ToBoolean بود .
ممنون از شما که این قسمت رو یاد آوری کردین . من تا الان کار زیادی با Thread ها نکردم . واسه همین زیاد مسلط به این موضوع نیستم .
باتشکر احسان
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.