PDA

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



davidrobert
شنبه 03 آذر 1397, 11:48 صبح
سلام و خسته نباشید دوستان بنده دارم از Thread استفاده میکنم برای نمایش اطلاعات. تا برنامه ام هنگ نکنه و سری لود بشه اطلاعاتش. ولی متسفانه با این خطا رو به رو شدم.
149318
این دستور بنده هستش و برای بار اول دارم از Thread استفاده میکنم و اطلاعات زیاد نمیخوام موقع لود هنگ کنه.

private void setDataSource(DataTable table)
{
// Invoke method if required:
if (this.InvokeRequired)
{
this.Invoke(new SetDataSourceDelegate(setDataSource), table);
}
else
{
//for (int i = 0; i < table.Rows.Count; i++)
//{
// int percentage = (i + 1) * 100 / table.Rows.Count;
// label4.Text = percentage.ToString();
//}
dgv1.DataSource = table;
dgv1.AutoGenerateColumns = false;
progressBar1.Visible = false;
}
}

void loadTable()
{

try
{
DataTable dt = new DataTable();
if (Txt_Search.Text != "")
{
switch (Cmb_Search.Text)
{
case "شماره سند":
{
dt =
sabtMotovafyGabzPeshAndSanadGabr.Search_SM_SHS_Sho mareSanad(
Convert.ToDouble(Txt_Search.Text));
break;
}
case "ملیت":
{
dt = sabtMotovafyGabzPeshAndSanadGabr.Search_SM_Meleyat (Txt_Search.Text);
break;
}
case "کد ملی":
{
break;
}
case "شماره شناسنامه":
{
break;
}
case "وضعیت قبر":
{
break;
}
case "جنسیت":
{
break;
}
case "نام و نام خانوادگی":
{
break;
}
case "نام پدر":
{
break;
}
case "محل صدور":
{
break;
}
case "تاریخ تولد":
{
break;
}
case "تاریخ وفات":
{
break;
}
case "فاز":
{
break;
}
case "نام قطعه":
{
break;
}
case "قطعه":
{
break;
}
case "ردیف":
{
break;
}
case "شماره":
{
break;
}
case "طبقه":
{
break;
}
case "رزرو":
{
break;
}
case "شماره گواهی فوت":
{
break;
}
case "علت فوت":
{
break;
}
case "نام تحویل گیرنده":
{
break;
}
case "نسبت متوفی":
{
break;
}
case "محل وقوع فوت":
{
break;
}
case "استان محل سکونت":
{
break;
}
case "شهرستان محل سکونت":
{
break;
}
case "آدرس محل سکونت":
{
break;
}
case "بومی/غیر بومی":
{
break;
}
case "شماره تماس تحویل گیرنده":
{
break;
}
case "استان محل فوت":
{
break;
}
case "شهرستان محل فوت":
{
break;
}
case "آدرس محل فوت":
{
break;
}
case "وضعیت سند":
{
break;
}
case "وضعیت پرداخت":
{
break;
}
case "وضعیت متوفی":
{
break;
}
case "سند":
{
break;
}
case "بلوغ":
{
break;
}
case "از مقصد":
{
break;
}

case "به مقصد/محل دفن":
{
break;
}
case "توضیحات":
{
break;
}
case "نام کاربر ثبت کننده":
{
break;
}
default:
{
break;
}
}
setDataSource(dt);
progressBar1.Visible = false;
}
else if (Txt_Search.Text == "")
{
dgv1.DataSource = null;
progressBar1.Visible = false;
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void Txt_Search_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
Log(29);
progressBar1.Visible = true;
progressBar1.Style = ProgressBarStyle.Marquee;
System.Threading.Thread thread =
new System.Threading.Thread(new System.Threading.ThreadStart(loadTable));
thread.Start();
}
}



اگه راهی وجود داره ممنون میشم بنده راهنمایی کنید شدیدا نیاز دارم کامبوباکس به کار نمیاد بدون مشکل لود میشه ولی وقتی کامبوباکس میبینه خطا میده

davidrobert
شنبه 03 آذر 1397, 15:03 عصر
دوستان کسی با Thread کار نکرده شدیدا به نمونه سورس با Thread برای جلوگیری از هنگ و لود اطلاعات از دیتابیس نیاز دارم سورس های دیگه امتحان کردم یه سورس خطا نداد به کل برنامه بست تو هنگام جستجو لطفاً یه دستور Thread خوب بدون مشکل سراغ دارید بدید ممنون میشم شدیدا گیر هستم و اطلاعات هم زیاد هستش. یه ستور Thread با استفاده از progressBar که درصد فعالیت هم نشان بده ممنون میشم. یه نمونه دارید در اختیارم قرار بدید ممنون میشم با تشکر نحوه جستجو و نمایش بنده با با Combobox که عنوان جستجو رو انتخاب میکنم و توسط کادر متن متن وارد و جستجو میکنم.

Shadow_net
شنبه 03 آذر 1397, 19:38 عصر
سلام. برای جلوگیری از این خطا میتونید کد زیر رو در کانستراکتور یا فرم لود قرار بدید

CheckForIllegalCrossThreadCalls = false;

البته این روش اصولی نیست
در ترد بهتره از object استفاده نشه و میتونید این کار رو توسط delegate و invoke انجام بدید
مثال : https://stackoverflow.com/questions/15759688/update-label-text-in-background-worker-winforms
اگر اشتباه نکنم در دات نت 4.5 به بعد هم میتونید از Func و Action و Async / Await استفاده کنید که سطح انتزاعی بالاتری دارند
در ضمن BackgroundWorker رو هم فراموش نکنید

رامین مرادی
سه شنبه 06 آذر 1397, 10:26 صبح
ترد برا سریع لود کردن اطلاعات نیست. ترد جهت اجرای موازی باسایر موراد هست که کنار هم و تو نخ های مجزا اجرا بشن. بشخصه توصیه نمیکنم از ترد استفاده کنید اگه برنامتون تحت شبکه هست و از دیتابیس دارید میخونید.
اگه میخواید هنگام لود کردن داده هاتون فرمتون هنگ نکنه میتونید از بک گراند ورکر استفاده کنید. استفاده از اون کدی که دوستمون بهش اشاره کردن هم کار درستی نیست خودشونم ذکر کردن.
برا دسترسی به اشیای روی فرم هم از همون دلیگیت استفاده کنید .همین لینکی که دوستمون معرفی کردن.

farhad_shiri_ex
سه شنبه 06 آذر 1397, 17:37 عصر
سلام و خسته نباشید دوستان بنده دارم از Thread استفاده میکنم برای نمایش اطلاعات. تا برنامه ام هنگ نکنه و سری لود بشه اطلاعاتش. ولی متسفانه با این خطا رو به رو شدم.
149318
این دستور بنده هستش و برای بار اول دارم از Thread استفاده میکنم و اطلاعات زیاد نمیخوام موقع لود هنگ کنه.

private void setDataSource(DataTable table)
{
// Invoke method if required:
if (this.InvokeRequired)
{
this.Invoke(new SetDataSourceDelegate(setDataSource), table);
}
else
{
//for (int i = 0; i < table.Rows.Count; i++)
//{
// int percentage = (i + 1) * 100 / table.Rows.Count;
// label4.Text = percentage.ToString();
//}
dgv1.DataSource = table;
dgv1.AutoGenerateColumns = false;
progressBar1.Visible = false;
}
}

void loadTable()
{

try
{
DataTable dt = new DataTable();
if (Txt_Search.Text != "")
{
switch (Cmb_Search.Text)
{
case "شماره سند":
{
dt =
sabtMotovafyGabzPeshAndSanadGabr.Search_SM_SHS_Sho mareSanad(
Convert.ToDouble(Txt_Search.Text));
break;
}
case "ملیت":
{
dt = sabtMotovafyGabzPeshAndSanadGabr.Search_SM_Meleyat (Txt_Search.Text);
break;
}
case "کد ملی":
{
break;
}
case "شماره شناسنامه":
{
break;
}
case "وضعیت قبر":
{
break;
}
case "جنسیت":
{
break;
}
case "نام و نام خانوادگی":
{
break;
}
case "نام پدر":
{
break;
}
case "محل صدور":
{
break;
}
case "تاریخ تولد":
{
break;
}
case "تاریخ وفات":
{
break;
}
case "فاز":
{
break;
}
case "نام قطعه":
{
break;
}
case "قطعه":
{
break;
}
case "ردیف":
{
break;
}
case "شماره":
{
break;
}
case "طبقه":
{
break;
}
case "رزرو":
{
break;
}
case "شماره گواهی فوت":
{
break;
}
case "علت فوت":
{
break;
}
case "نام تحویل گیرنده":
{
break;
}
case "نسبت متوفی":
{
break;
}
case "محل وقوع فوت":
{
break;
}
case "استان محل سکونت":
{
break;
}
case "شهرستان محل سکونت":
{
break;
}
case "آدرس محل سکونت":
{
break;
}
case "بومی/غیر بومی":
{
break;
}
case "شماره تماس تحویل گیرنده":
{
break;
}
case "استان محل فوت":
{
break;
}
case "شهرستان محل فوت":
{
break;
}
case "آدرس محل فوت":
{
break;
}
case "وضعیت سند":
{
break;
}
case "وضعیت پرداخت":
{
break;
}
case "وضعیت متوفی":
{
break;
}
case "سند":
{
break;
}
case "بلوغ":
{
break;
}
case "از مقصد":
{
break;
}

case "به مقصد/محل دفن":
{
break;
}
case "توضیحات":
{
break;
}
case "نام کاربر ثبت کننده":
{
break;
}
default:
{
break;
}
}
setDataSource(dt);
progressBar1.Visible = false;
}
else if (Txt_Search.Text == "")
{
dgv1.DataSource = null;
progressBar1.Visible = false;
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void Txt_Search_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
Log(29);
progressBar1.Visible = true;
progressBar1.Style = ProgressBarStyle.Marquee;
System.Threading.Thread thread =
new System.Threading.Thread(new System.Threading.ThreadStart(loadTable));
thread.Start();
}
}



اگه راهی وجود داره ممنون میشم بنده راهنمایی کنید شدیدا نیاز دارم کامبوباکس به کار نمیاد بدون مشکل لود میشه ولی وقتی کامبوباکس میبینه خطا میده

خوب توی یک worker Thread دیگه که نمی تونید به آبجکتهای ساخته شده توی Main Thread برنامه تون دسترسی داشته باشید بهتره که مقدار آبجکت comboBox را که توی switch دارید تست میکنید را به worker thread ارسال کنید البته باید با تکنیکهای همگام سازی داده ها این کار رانجام بدید البته از کتابخانه های مثل TPL / PLINK هم می تونید استفاده کنید.

davidrobert
چهارشنبه 14 آذر 1397, 13:46 عصر
دوستان بنده مشکل Thread حل کرد 50 درصد ولی موقع دریافت یک دفعه هنگ میکنه
و این بگم روی سیستم مشتری ام که با برنامه قبلی کار میکنن از حالت مکس استفاده شده یعنی تا برنامه باز میشه همون لحظه 25 هزار اطلاعات نمایش میده ولی وقتی اسکیول به سمت بالا یا پایین میره یه مکس میکنه و بعد اطلاعات نمایش میده این روش به چه صورت اول به تعداد گرید ویو در حال نمایش اطلاعات نمایش میده ولی بعد از حرکت اسکیول ادامه اطلاعات رو میخونه و بعد نمایش میده 25 هزار تا اطلاعات دارم و لازم دارم اول سریع نمایش بده چون تبدیل تاریخ روی اسکیول سرور انجام میدم به همین خارج لود اطلاعات میکشه اگه تاریخ تبدیل نکنم موقع نمایش از سرور ظرف یک یا 6 ثانیه 25 هزار تا اطلاعات نمایش میده ولی وقتی عمل تبدیل تاریخ روی سرور یا خود برنامه انجام بدم باز کلی میکشه 25 هزار تا رو 4 دقیقه کشید لود کنه که اصلا خوب نیست برنامه من تحت شبکه هستش.

رامین مرادی
چهارشنبه 14 آذر 1397, 15:28 عصر
خب برا تبدیل تاریخ ممکنه الگوریتمون بهینه نباشه. ولی 25 هزار رکورد چیزی نیست چرا باید اینهمه طول بکشه!!! مگه اینکه شبکشون مشکل داشته باشه . تو نرم افزار ما که تو شرکت استفاده میکنیم یه فرمی داریم بالای 55 هزار رکورد رو تو کسری از ثانیه برمیگردونه . اوئنم شبکه داخلیمون وای فای هست و نسبت به کابلی مشکلاتشم خودتون بهتر میدونید.
در ضمن کاربر همه این 25 هزار رکورد رو یجا میخواد چیکار؟؟ صورت مسئله رو بگید شاید بشه یه روش بهتری پیشنهاد داد. اگه بحث جستجو هست خب برا بار اول که لود میکنی تاریخ هارو نیار و تبدیل نکن. کاربر که مقدار مورد نظر خودشو پیدا کرد مثلا روش کلیک کرد اطلاعات اون سطر رو بخون. (در ضمن اگه برات مقدوره تاریخ رو همونجور عادی ذخیره کن و دیگه مشکل پرهزینه ای مثل تبدیل تاریخ رو نداشته باشی)

davidrobert
چهارشنبه 14 آذر 1397, 18:08 عصر
خب برا تبدیل تاریخ ممکنه الگوریتمون بهینه نباشه. ولی 25 هزار رکورد چیزی نیست چرا باید اینهمه طول بکشه!!! مگه اینکه شبکشون مشکل داشته باشه . تو نرم افزار ما که تو شرکت استفاده میکنیم یه فرمی داریم بالای 55 هزار رکورد رو تو کسری از ثانیه برمیگردونه . اوئنم شبکه داخلیمون وای فای هست و نسبت به کابلی مشکلاتشم خودتون بهتر میدونید.
در ضمن کاربر همه این 25 هزار رکورد رو یجا میخواد چیکار؟؟ صورت مسئله رو بگید شاید بشه یه روش بهتری پیشنهاد داد. اگه بحث جستجو هست خب برا بار اول که لود میکنی تاریخ هارو نیار و تبدیل نکن. کاربر که مقدار مورد نظر خودشو پیدا کرد مثلا روش کلیک کرد اطلاعات اون سطر رو بخون. (در ضمن اگه برات مقدوره تاریخ رو همونجور عادی ذخیره کن و دیگه مشکل پرهزینه ای مثل تبدیل تاریخ رو نداشته باشی)

این تست رو روی جفت سیستم خودم گرفتم و همین طور روی سیستم مشتری اسکیول روی سیستم باشه چون از Function استفاده کردم برای تبدیل تاریخ چون تاریخ ها به کل میلادی ذخیره میشن سمت سرور و موقع نمایش تبدیل میشه به شمسی چون گزارش گیری داره و تو گزارش گیری برحسب تاریخ ها هستن گزارش گیری انجام میشه بخاطر همین تاریخ میلادی هستش و به کاربر نمیتوانم تاریخ میلادی نشان بدم بایستی تاریخ برگردانم به شمسی روی خود اسکیول و همین طور روی برنامه هرجفتش خیلی زمانبر هستش ولی طوری باشه وقتی فرم لود شد به اندازه همان گرید اطلاعات بیاد و وقتی اسکرول حرکت کرد ادامه اش بیاد که کاربر متوجه اش نشه بلکه من تو یک ثانیه 25 هزار تا رکورد لود میکنم اگه تبدیل نکنم ولی به این تبدیل نیاز دارم.
ممنون بابت کمکتان

رامین مرادی
جمعه 16 آذر 1397, 11:59 صبح
چرا از اول به صورت شمسی ذخیره نکردید؟

davidrobert
جمعه 16 آذر 1397, 12:51 عصر
چرا از اول به صورت شمسی ذخیره نکردید؟

بخاطر گزارش ها که با تاریخ و به صورت های مختلف و با نمودار که فقط تاریخ میلادی رو قبول میکنه به همین خاطر تاریخ شمسی میدم برای جستجو ولی ما بین تاریخ میلادی میگیرده و میاره و یه یکسری محاسبات مثل سن و بلوغ اتوماتیک روی سرور انجام میشه توسط تریگر برای هر ستونی که ثبت میشه یعنی عملیات سن و بلوغ و موارد دیگه من روی برنامه نمینویسم خود اسکیول انجام میده نصف کارها رو روی هر ستون که یا ویرایش میشه یا ذخیره فقط همون ستون جاری توسط خود اسکیول انجام میشه به همین خاطر درصد خطا هم پایین میاد