PDA

View Full Version : مبتدی: بستن فرم باز از طریق یک تابع دیگر



ozzy_mra
دوشنبه 12 بهمن 1388, 14:29 عصر
اساتید بزرگوار سلام
من تو پروژم از ترد استفاده کردم که تو تابع تردم یه عملیات زمانگیر کپی اطلاعات را انجام می ده و من در حین انجام این تابع یه فرم جدید واسه انتظار رو باز می کنم و می خوام وقتی کار کپیم تموم شد فرم ویت هم بسته بشه کدی که استفاده می کنم اینه

public void threadFunc(string folderPath)
{
CopyFolder(folderPath, "e:\\ftp\\102\\OutBox");
MessageBox.Show("˜í ÇØáÇÚÇÊ ÈÇ ãæÝÞíÊ Èå ÇÊãÇã ÑÓíÏ.");
foreach (Form frm in Application.OpenForms)
{
if (frm is waitFRM)
{
frm.Close();
frm.Dispose();
}
}

}
ولی برنامه فرم wait من بسته نمی شه میشه راهنماییم کنید چجوری میشه این فرم باز رو ببندم؟

saied_genius
دوشنبه 12 بهمن 1388, 17:44 عصر
خوب چه پيغامي مي دهد؟ error مي دهد يا فقط فرم بسته نمي شود؟

saied_genius
دوشنبه 12 بهمن 1388, 19:31 عصر
احتمالاً پيغام Collection was modified را مي دهد.

از کد زير استفاده کنيد.


for (int i = 0; i < Application.OpenForms.Count; i++)
{
if (Application.OpenForms[i].Name == "waitFRM")
{
Application.OpenForms[i].Close();
Application.OpenForms[i].Dispose();
}
}


موفق باشيد.

ozzy_mra
سه شنبه 13 بهمن 1388, 07:24 صبح
خوب چه پیغامی می دهد؟ error می دهد یا فقط فرم بسته نمی شود؟

سلام
پیغامی نمی ده فقط بسته نمی شه

ozzy_mra
سه شنبه 13 بهمن 1388, 07:34 صبح
پیغام زیر رو میده
من فرم ویتمو تو ایونت کلیک باتنم باز می کنم ولی می خوام تو تابع تردم ببندمش ایرادی که می گیره به خاطر این نیست؟

saied_genius
سه شنبه 13 بهمن 1388, 11:24 صبح
شما بايد يک راه حلي براي مشکل CrossThreading خود پيدا کنيد.

الان يادم نيست براي اين کار بايد چيکار کني ، ولي در کل بايد از Invoke استفاده کني تا بتواني کد يک thread را در thread ديگر اجرا کني.

موفق باشيد.

ozzy_mra
سه شنبه 13 بهمن 1388, 13:30 عصر
ممنون
راهی وجود داره که بفهمم که اجرای تابع تردم تموم شده ؟

saied_genius
سه شنبه 13 بهمن 1388, 13:34 عصر
راه های مختلفی هست

1- می توانی با یک متغیر bool چک کنی.

یک متغیر bool از نوع public static بسازی و مثلاً در یک تایمر چک کنی هر وقت false شد ، فرم مورد نظر را ببندی

بهترين راه نيست ، ولي يک راه حله

موفق باشيد.

hakelberfin
سه شنبه 13 بهمن 1388, 15:19 عصر
این Errror به خاطر اینه که Thread شما میخواد به عنصری دسترسی داشته باشه که مالکش نیست.
باید از تابع BeginInvoke استفاده کنی .
تو همین سایت هم در این مورد چیزای خوبی میتونی پیدا کنی .در قسمت 1001ترفند هم Bermooda در این مورد توضیحاتی داده