PDA

View Full Version : سوال: مشکل ترد با پروگرسبار



esafb52
سه شنبه 21 خرداد 1392, 22:07 عصر
با سلام به همه عزیزان من یه متد برای درج در دیتابیس به صورت گروهی دارم که ممکنه 10000 هزار رکورد رو در یه حلقه با هم درج کنه
حالا 2 مشکل دارم:
1- وقتی ترد رو اجرا میکنم به پروگرس بار گیر میده !!
2- اصلا نحوه استفاده از تردم درسته یا نه چون تازه سراغش رفتم
متد من :

private void groupeinsert()
{
progressBar1.Show();
string path = fd.SelectedPath;
DirectoryInfo di = new DirectoryInfo(path);
string[] file1 = Directory.GetFiles(fd.SelectedPath, "*.jpg", SearchOption.AllDirectories);
FileInfo[] file = new FileInfo[file1.Length];
file = di.GetFiles("*.jpg", SearchOption.AllDirectories);
SqlCommand cmd3 = new SqlCommand();
cmd3.Connection = con;
da.SelectCommand = cmd3;
string pic = "no number";
con.Open();
foreach (FileInfo item in file)
{

string mas = item.FullName;
pic = Path.GetFileNameWithoutExtension(mas);
string bb = Path.GetFileNameWithoutExtension(mas);
cmd3.CommandType = CommandType.StoredProcedure;
cmd3.CommandText = "insertsp1";
cmd3.Parameters.AddWithValue("@fullname", bb);
cmd3.Parameters.AddWithValue("@path", mas);
cmd3.Parameters.AddWithValue("@picnumber", pic);
cmd3.ExecuteNonQuery();
cmd3.Parameters.Clear();
progressBar1.PerformStep();

}

MessageBox.Show("عکس ها با موفقیت اضافه شد");
}

نحوه فراخوانی هم به این شکل :

if (fd.ShowDialog()==DialogResult.OK)
{
Thread t1 = new Thread(new ThreadStart(sssssss));
t1.Start();
// sssssss();


}

اگه ممکنه راهنمایی کنید چطور میشه کدم رو بهینه کنم و این مشکل رو حل کنم

tooraj_azizi_1035
سه شنبه 21 خرداد 1392, 22:11 عصر
this.Invoke(new Action(() =>
{
progressBar1.PerformStep();
}));

esafb52
سه شنبه 21 خرداد 1392, 22:16 عصر
this.Invoke(new Action(() =>
{
progressBar1.PerformStep();
}));

ممنون چطور این کد رو بهینه کنم که سرعت بالتری داشته باشه؟؟مرجع this هم ترد جاری هست؟؟ از لینک استفاده کردی؟؟؟

tooraj_azizi_1035
سه شنبه 21 خرداد 1392, 22:28 عصر
this فرم مالک کنترل ProgressBar است و در مورد کدهای زیر که باید قبل از حلقه قرار بگیرند:
cmd3.CommandType = CommandType.StoredProcedure; cmd3.CommandText = "insertsp1";
cmd3.Parameters.AddWithValue("@fullname", bb);
cmd3.Parameters.AddWithValue("@path", mas);
cmd3.Parameters.AddWithValue("@picnumber", pic);


و این که اضافه است:
cmd3.Parameters.Clear();

svhasvha
سه شنبه 21 خرداد 1392, 22:31 عصر
با سلام به همه عزیزان من یه متد برای درج در دیتابیس به صورت گروهی دارم که ممکنه 10000 هزار رکورد رو در یه حلقه با هم درج کنه
حالا 2 مشکل دارم:
1- وقتی ترد رو اجرا میکنم به پروگرس بار گیر
میده !!
2- اصلا نحوه استفاده از تردم درسته یا نه چون تازه سراغش رفتم
متد من :

private void groupeinsert()
{
progressBar1.Show();
string path = fd.SelectedPath;
DirectoryInfo di = new DirectoryInfo(path);
string[] file1 = Directory.GetFiles(fd.SelectedPath, "*.jpg", SearchOption.AllDirectories);
FileInfo[] file = new FileInfo[file1.Length];
file = di.GetFiles("*.jpg", SearchOption.AllDirectories);
SqlCommand cmd3 = new SqlCommand();
cmd3.Connection = con;
da.SelectCommand = cmd3;
string pic = "no number";
con.Open();
foreach (FileInfo item in file)
{

string mas = item.FullName;
pic = Path.GetFileNameWithoutExtension(mas);
string bb = Path.GetFileNameWithoutExtension(mas);
cmd3.CommandType = CommandType.StoredProcedure;
cmd3.CommandText = "insertsp1";
cmd3.Parameters.AddWithValue("@fullname", bb);
cmd3.Parameters.AddWithValue("@path", mas);
cmd3.Parameters.AddWithValue("@picnumber", pic);
cmd3.ExecuteNonQuery();
cmd3.Parameters.Clear();
progressBar1.PerformStep();

}

MessageBox.Show("عکس ها با موفقیت اضافه شد");
}

نحوه فراخوانی هم به این شکل :

if (fd.ShowDialog()==DialogResult.OK)
{
Thread t1 = new Thread(new ThreadStart(sssssss));
t1.Start();
// sssssss();


}

اگه ممکنه راهنمایی کنید چطور میشه کدم رو بهینه کنم و این مشکل رو حل کنم
سلام
یه سر به این بزن
http://barnamenevis.org/showthread.php?400809-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B3%D8%A7%D8%AF%D9%87-%D9%88%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-progressBar

esafb52
سه شنبه 21 خرداد 1392, 22:50 عصر
this فرم مالک کنترل ProgressBar است و در مورد کدهای زیر که باید قبل از حلقه قرار بگیرند:
cmd3.CommandType = CommandType.StoredProcedure; cmd3.CommandText = "insertsp1";
cmd3.Parameters.AddWithValue("@fullname", bb);
cmd3.Parameters.AddWithValue("@path", mas);
cmd3.Parameters.AddWithValue("@picnumber", pic);


و این که اضافه است:
cmd3.Parameters.Clear();
تشکر از توجه و پاسختون استفاده از ترد درسته؟

esafb52
سه شنبه 21 خرداد 1392, 22:51 عصر
سلام
یه سر به این بزن
http://barnamenevis.org/showthread.php?400809-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B3%D8%A7%D8%AF%D9%87-%D9%88%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-progressBar
این رو قبلا دیدم استفاده هم کردم ممنون

tooraj_azizi_1035
چهارشنبه 22 خرداد 1392, 12:26 عصر
استفاده از ترد در این سناریو درست نیست شما می تونستید یک SP در SQL Server توی بانکتون بسازید و فقط مسیر دایرکتوری رو به اون پاس می دادید و بقیه کار رو در یک حلقه خود SP روی سرور انجام می داد و دیگه برنامه درگیر جزئیات نمی شد.
البته این برای زمانی است که عکس ها روی سرور هستند.

esafb52
چهارشنبه 22 خرداد 1392, 12:40 عصر
استفاده از ترد در این سناریو درست نیست شما می تونستید یک SP در SQL Server توی بانکتون بسازید و فقط مسیر دایرکتوری رو به اون پاس می دادید و بقیه کار رو در یک حلقه خود SP روی سرور انجام می داد و دیگه برنامه درگیر جزئیات نمی شد.
البته این برای زمانی است که عکس ها روی سرور هستند.
با سلام و تشکر از پاسختون
برای نکته اول باید بگم که برنامه منwin app هستش
2-و منم با یه استور پروسجر دارم این کار رو انجام میدم!!!