PDA

View Full Version : استفاده از ترد



zohre66
چهارشنبه 29 بهمن 1393, 06:28 صبح
با سلام خدمت همه دوستان
من تو پروژه ام برای لود فرم هایی که سنگین بودند و دیر باز می شدند از لودینگ استفاده کردم. یه کلاس تعریف کردم و جاهای که لازم داشتم start و یا stop کردم. خیلی از وقتها تو سیستم ها مختلف با ارور Thread مواجه می شوم

private static Thread th;
//= new Thread(new ThreadStart(showProgressForm));
public void startProgress()
{
th = new Thread(new ThreadStart(showProgressForm));
th.Name = "first";
th.Start();

}

private static void showProgressForm()
{
FrmLoading sForm = new FrmLoading();
sForm.BringToFront();
sForm.ShowDialog();
}

public void stopProgress()
{
if (th != null)
{
th.Abort();

th = null;
}
}

(FrmLoading فرم ساده ای هست یه شکل را نمایش می دهد)
تو فرم هایی هم سنگین بودند در InitializeComponent ایت ترد را استارد و در تابع لود فرمم این را استاپ کردم.
مشکل از کجاست ؟؟؟؟؟

hamid_hr
چهارشنبه 29 بهمن 1393, 09:38 صبح
چه ارروری میده؟

SabaSabouhi
چهارشنبه 29 بهمن 1393, 09:54 صبح
سلام
آیا خطایی که می‌گیری مربوط به Cross referencing هست؟

صبا صبوحی

zohre66
چهارشنبه 29 بهمن 1393, 10:53 صبح
خیر
ارور continue میده که تو متن ان نوشته Thread .( و یا خیلی وقت ها هم هنگ می کنه مخصوصا سیستم هایی که سخت افزاریشون پایین تره)
در ضمن کجا می توانیم مشاهده کنیم که در حال حاضر در حال اجرا هست یا نه

ali_md110
چهارشنبه 29 بهمن 1393, 11:22 صبح
از BackGroundWorker استفاده کنید
عملیات سنگین در پس زمینه انجام بشه و ترد اصلی برنامه مشغول نباشه


BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += (o, ea) =>
{
System.Threading.Thread.Sleep(500);

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


}));
};

worker.RunWorkerCompleted += (o, ea) =>
{
بستن فرم انتظار
};
نمایش فرم انتظار
worker.RunWorkerAsync();

ghasem110deh
چهارشنبه 29 بهمن 1393, 12:56 عصر
از BackGroundWorker استفاده کنید
عملیات سنگین در پس زمینه انجام بشه و ترد اصلی برنامه مشغول نباشه


BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += (o, ea) =>
{
System.Threading.Thread.Sleep(500);

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


}));
};

worker.RunWorkerCompleted += (o, ea) =>
{
بستن فرم انتظار
};
نمایش فرم انتظار
worker.RunWorkerAsync();




سلام و با اجازه از zohre66 (http://barnamenevis.org/member.php?179988-zohre66) که وسط بحثشون پریدم

من تو فورم بکاپ گیری (دیتابیس sql) از perogressBar استفاده کردم با step و ...
اما هیچ ربطی به عملیات بکاپ نداره ! (یعنی نتونستم به هم مرتبطشون کنم)
الان ممکن بکاپ تموم بشه (حجم کم) ولی پروگرسبار هنوز پر نشده ! و یا برعکس تو حجم زیاد ... با این روش میشه ردیفش کرد ؟
.
.
.
و این نمونه ای که گذاشتین ، تا وقتی کل اطلاعات از دینابیس لود نشده تو دیتاگریدویو فورم لود رو نشون میده ؟ (نسبت به مثالی که فرمودین)

ali_md110
چهارشنبه 29 بهمن 1393, 14:30 عصر
بله تا وقتی لود اطلاعات تمام لود نشه فرم متظر بمانید نشون داده میشه
من از این روش توی پترن MVVM استفاده میکنم

ghasem110deh
چهارشنبه 29 بهمن 1393, 14:37 عصر
بله تا وقتی لود اطلاعات تمام لود نشه فرم متظر بمانید نشون داده میشه
من از این روش توی پترن MVVM استفاده میکنم

ممنون و الان می رم سراغ امتحان کردن ...
و این چیه :
پترن MVVM ؟

ali_md110
چهارشنبه 29 بهمن 1393, 15:07 عصر
http://barnamenevis.org/showthread.php?485912
منظورم از MVVM

zohre66
چهارشنبه 29 بهمن 1393, 21:38 عصر
سلام خدمت همه دوستان
مشکل کد من چیه؟؟ من به خاطر یکسری از دلایل نمیخواستم BackgroundWorker استفاده کنم .

محمد آشتیانی
چهارشنبه 29 بهمن 1393, 21:51 عصر
سلام
این Thread پردازش خاصی انجام نمیده ، بنابراین سخت افزار ، قدیمی و ضعیف هم که باشه احتمال زیاد نمیتونه علت این خطا باشه
لطفا متن کامل ارور رو اینجا بگذارید

SabaSabouhi
پنج شنبه 30 بهمن 1393, 08:47 صبح
سلام و با اجازه از zohre66 (http://barnamenevis.org/member.php?179988-zohre66) که وسط بحثشون پریدم

من تو فورم بکاپ گیری (دیتابیس sql) از perogressBar استفاده کردم با step و ...
اما هیچ ربطی به عملیات بکاپ نداره ! (یعنی نتونستم به هم مرتبطشون کنم)
الان ممکن بکاپ تموم بشه (حجم کم) ولی پروگرسبار هنوز پر نشده ! و یا برعکس تو حجم زیاد ... با این روش میشه ردیفش کرد ؟
.
.
.
و این نمونه ای که گذاشتین ، تا وقتی کل اطلاعات از دینابیس لود نشده تو دیتاگریدویو فورم لود رو نشون میده ؟ (نسبت به مثالی که فرمودین)

سلام
دو تا پیش‌نهاد دارم.
اول این که از یادگیری استفاده کنی. یعنی هر بار که backup می‌گیری زمانش رو نگه‌داری و در نوبت بعدی از اون زمان به عنوان مرجع استفاده کنی.
با توجه به این که حجم دیتابیس در هر نوبت backup گیری تغییر فاحشی نسبت با بار قبلی نداره ( به شرط backupگیری منظم ) نتیجه چیز قابل قبولی
خواهد بود.
و دوم این که بجای progress bar معمولی که باید پر بشه، از اون مدل progressها نشون بده که پر نمی‌شن، دائم دور خودشون می‌چرخن.

صبا صبوحی

ghasem110deh
پنج شنبه 30 بهمن 1393, 18:31 عصر
دقیقا میخوام همین کار رو انجام بدم !
که بجای اون پروگرس معمولی توی خود فرم بکاپ ، از یه پروگرس چرخشی استفاده کنم تو یه فرم (فرم انتظار) ...
منتها به این قسمت کلا گیر میده :

})); };

worker.RunWorkerCompleted += (o, ea) =>
{
بستن فرم انتظار
};
نمایش فرم انتظار
worker.RunWorkerAsync();

قبلش دستورات نمایش توی گرید ویو رو گذاشتم ...
ولی میگه که تو رفرنس موجود نیست !
هم بکگراند ورکر به فرم اضاففه کردم و هم فضای نام رو یوزینگ کردم !