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-1404, Jelsoft Enterprises Ltd.