PDA

View Full Version : مشگل NotRespondig در برنامه من ؟



mdssoft
پنج شنبه 27 دی 1386, 00:55 صبح
با سلام خدمت دوستان
بچه ها من یه برنامه برای تغییر نام فایل ها به صورت دسته ای نوشتم (Batch Renamer) اما مشکلات زیر رو داره :
1. وقتی برنامه در حال اجرا هست و مشغول تغییر نام فایل هاست اگر پنجره برنامه رو Move کنید Not Responding می ده و و قتی از این حالت بیرون میاد که کارش تموم شده باشه.
2. یه دکمه برای Cancel کردن عملیات گذاشتم ، اما در حین اجرا اصلا نمیشه روش کلیک کرد و در صورت کلیک کردن دوباره NotResponding میده .
3. در هنگام اجرا اگر روی یه پنجره دیگر کلیک کنید و دوباره بخوام به برنامه برگردم و روند پیشرفت رو ببینم بازم NotResponding میده .
ممنون میشم کمکم کنید چون خیلی روش کار کردم اما نتونستم راه حلی پیدا کنم
سورس برنامه رو Attach کردم ، با VS 2005 این برنامه رو نوشتم .

13780

sinpin
پنج شنبه 27 دی 1386, 03:59 صبح
با سلام خدمت دوستان
بچه ها من یه برنامه برای تغییر نام فایل ها به صورت دسته ای نوشتم (Batch Renamer) اما مشکلات زیر رو داره :
1. وقتی برنامه در حال اجرا هست و مشغول تغییر نام فایل هاست اگر پنجره برنامه رو Move کنید Not Responding می ده و و قتی از این حالت بیرون میاد که کارش تموم شده باشه.
2. یه دکمه برای Cancel کردن عملیات گذاشتم ، اما در حین اجرا اصلا نمیشه روش کلیک کرد و در صورت کلیک کردن دوباره NotResponding میده .
3. در هنگام اجرا اگر روی یه پنجره دیگر کلیک کنید و دوباره بخوام به برنامه برگردم و روند پیشرفت رو ببینم بازم NotResponding میده .
ممنون میشم کمکم کنید چون خیلی روش کار کردم اما نتونستم راه حلی پیدا کنم
سورس برنامه رو Attach کردم ، با VS 2005 این برنامه رو نوشتم .
13780
من سورس شما رو نگاه نکردم و عملکرد اون رو هم نمیدونم. فقط دو نکته :
1- اگه با فایلهایی با حجم بالا کار میکنید بهتره - جهت stable بودن - عملیات کار با فایل رو در یک thread مستقل انجام بدید.
2- اما اگه با فایلهای با حجم کم اما با تعداد زیاد (و در یک حلقه) کار میکنید بهتره هر از گاهی برنامه بتونه ایونتهای خودش (= همون تراکنشهای کاربر) رو هندل کنه (مثلا با استفاده از یک DoEvents ساده) تا برنامه Not Respond نشه.

mdssoft
پنج شنبه 27 دی 1386, 11:39 صبح
ممنون از پاسخ شما
اما من مشگلم در ایجاد یه Thread مستقل در Form است

من با کد زیر سعی کردم Thread مستقل ایجاد کنم
آیا صحیح است :


/// ///////////////////////////////////
private void rename_Click(object sender, EventArgs e)
{
DialogResult result = MessageBox.Show("آیا مطمئن هستید ؟", "اخطار", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (result == DialogResult.Yes)
{
Thread tr = new Thread(new ThreadStart(chnTarget));
tr.Start();
}
}

/// ///////////////////////////////////
private void chnTarget()
{
this.Invoke(new ThreadStart(ChangeName));
}

/// ///////////////////////////////////
private void ChangeName()
{
string folder_path = SelectedPathText.Text;
long progress_value = 0;
string new_filename = "";

progressBar1.Value = 0;

try
{
string[] full_path_filenames = System.IO.Directory.GetFiles(folder_path);

progressBar1.Maximum = full_path_filenames.Length;
if (full_path_filenames.Length == 0) throw new Exception("No File Found \n");

foreach (string filename in full_path_filenames)
{
progress_value++;

try
{
if (!random.Checked)
{
new_filename = folder_path + "\\" + progress_value + Path.GetExtension(filename);
}
else
{
new_filename = RandomName(folder_path, filename);
}

File.Move(filename, new_filename);
}
catch (Exception ex)
{

}

progressBar1.Value = (int)progress_value;
progressBar1.Update();
}
SelectedPathText.Text = "Complete";
}
catch (Exception ex)
{
SelectedPathText.Text = ex.Message;
}
}

/// ///////////////////////////////////
private string RandomName(string folder_path, string filename)
{
Random rand = new Random(DateTime.Now.Second);
string new_filename = folder_path + "\\" + Char.ConvertFromUtf32(rand.Next(14, 255)) +
Char.ConvertFromUtf32(rand.Next(14, 255)) + Char.ConvertFromUtf32(rand.Next(14, 255)) +
Char.ConvertFromUtf32(rand.Next(14, 255)) + Path.GetExtension(filename);

return new_filename;
}

private void Cancel_Click(object sender, EventArgs e)
{
Thread.CurrentThread.Abort();
}

mdssoft
پنج شنبه 27 دی 1386, 13:37 عصر
سلام دوست عزیز
برای حل این مشکل احتیاج به Thread نداری. در واقع ریسمان ها کاربرد های خیلی بهتری دارند. شما بهتره از یک حلقه ساده استفاده کنید.



bool cancel = false;
string[] files = GetListOfFilesInSpecifiedDirectory();

for(int i = 0; i < files.Length; i++)
{

DoRenameFile(files[i]);
Application.DoEvents(); // This solves the 'Not Responding' Issue
if(cancel)
{

break;
}
}
cancel = false;

این هم کد کلید Cancel


private void CancelButton_Click(object sender, EventArgs e)
{

cancel = true;
}

sinpin
پنج شنبه 27 دی 1386, 17:42 عصر
سلام دوست عزیز
برای حل این مشکل احتیاج به Thread نداری. در واقع ریسمان ها کاربرد های خیلی بهتری دارند. شما بهتره از یک حلقه ساده استفاده کنید.



bool cancel = false;
string[] files = GetListOfFilesInSpecifiedDirectory();

for(int i = 0; i < files.Length; i++)
{
DoRenameFile(files[i]);
Application.DoEvents(); // This solves the 'Not Responding' Issue
if(cancel)
{
break;
}
}
cancel = false;
این هم کد کلید Cancel


private void CancelButton_Click(object sender, EventArgs e)
{
cancel = true;
}

من متوجه نشدم شما این رو برای چه کسی نوشتید ؟!
خب من هم دقیقا همین رو گفته بودم:

1- اگه با فایلهایی با حجم بالا کار میکنید بهتره - جهت stable بودن - عملیات کار با فایل رو در یک thread مستقل انجام بدید.
2- اما اگه با فایلهای با حجم کم اما با تعداد زیاد (و در یک حلقه) کار میکنید بهتره هر از گاهی برنامه بتونه ایونتهای خودش (= همون تراکنشهای کاربر) رو هندل کنه (مثلا با استفاده از یک DoEvents ساده) تا برنامه Not Respond نشه.