PDA

View Full Version : سوال: یوزر کنترل



qasemf
شنبه 15 آذر 1399, 01:45 صبح
سلام دارم یه اپ انتقال فایل مینویسم میخواستم بدونم چطوری میشه زمانی که چندتا انتقال باهم به صورت همزمان در حال اجرا هستن.. داخل یه فرم زیر هم نمایش داده بشن مثل teracopy ...
میخواستم ببینم باید از یوزر کنترل استفاده کرد؟ راهکار چیه ممنون میشم راهنمایی کنید

the king
شنبه 15 آذر 1399, 10:15 صبح
سلام دارم یه اپ انتقال فایل مینویسم میخواستم بدونم چطوری میشه زمانی که چندتا انتقال باهم به صورت همزمان در حال اجرا هستن.. داخل یه فرم زیر هم نمایش داده بشن مثل teracopy ...
میخواستم ببینم باید از یوزر کنترل استفاده کرد؟ راهکار چیه ممنون میشم راهنمایی کنید
بستگی داره که فقط نمایش ظاهر اش رو بخواهید یا بخواهید اجزاء داخلی ای داشته باشه که کاربر باهاش تعامل داشته باشه.
طراحی UserControl یا هر کلاس Control دیگری برای وقتی که میخواهید بجز نمایش ظاهر تعامل با کاربر هم داشته باشید (مثلا با دکمه هایی روال رو متوقف کنید) مناسبه.
اما اگر صرفا می خواهید ظاهر رو نمایش بدهید نیازی نیست که برایش کنترل اختصاصی بسازید، تغییر دادن ظاهر یک Panel یا PictureBox یا ListBox و ... کفایت می کنه.
مثلا در این پست صرفا نمایش ظاهر رو میخواستم :
سوال درباره ی اجرای چند نخی و استفاده از چند هسته بصورت همزمان
(https://barnamenevis.org/showthread.php?558733-%D8%B3%D9%88%D8%A7%D9%84-%D8%AF%D8%B1%D8%A8%D8%A7%D8%B1%D9%87-%DB%8C-%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-%DA%86%D9%86%D8%AF-%D9%86%D8%AE%DB%8C-%D9%88-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%DA%86%D9%86%D8%AF-%D9%87%D8%B3%D8%AA%D9%87-%D8%A8%D8%B5%D9%88%D8%B1%D8%AA-%D9%87%D9%85%D8%B2%D9%85%D8%A7%D9%86&p=2424868&viewfull=1#post2424868)اما اینجا تعامل با کاربر هم هست :
مشکل تایمر در لیست ویو (https://barnamenevis.org/showthread.php?560294-%D9%85%D8%B4%DA%A9%D9%84-%D8%AA%D8%A7%DB%8C%D9%85%D8%B1-%D8%AF%D8%B1-%D9%84%DB%8C%D8%B3%D8%AA-%D9%88%DB%8C%D9%88&p=2429234&viewfull=1#post2429234)

qasemf
دوشنبه 17 آذر 1399, 01:43 صبح
اره دقیقا کاربر باید بتونه تعامل داشته باشه مثلا انتقال رو متوقف کنه یا... ممنون بابت سورسی که فرستادین فقط من میخوام یوزر کنترلی که به toolbox اضافه کردم رو ازش استفاده کنم یه تکست باکس داره یه پروگرس بار و دوتا باتن که برای start و stop هستن اینطوری میتونم از این سورس کمک بگیرم؟و اینکه چطور میشه به ایتمهای این کنترل دسترسی پیدا کرد؟

the king
دوشنبه 17 آذر 1399, 09:49 صبح
اره دقیقا کاربر باید بتونه تعامل داشته باشه مثلا انتقال رو متوقف کنه یا... ممنون بابت سورسی که فرستادین فقط من میخوام یوزر کنترلی که به toolbox اضافه کردم رو ازش استفاده کنم یه تکست باکس داره یه پروگرس بار و دوتا باتن که برای start و stop هستن اینطوری میتونم از این سورس کمک بگیرم؟و اینکه چطور میشه به ایتمهای این کنترل دسترسی پیدا کرد؟
بله. فرض کنید که شما از کلاس کنترل دست ساز تون چند تا متغیر مثلا با اسامی x و y و z دارید و در هر کدوم یک شیء هست. همون موقع x.Name و y.Name و z.Name رو مشخص می کنید تا کنترل ها اسم خودشون داشته باشند، مثلا با اسامی "X" و "Y" و "Z" یا هر نام دلخواه دیگری.
حالا فرضا اون کنترل های x و y و z رو داخل کنترل دیگری مثل flowLayoutPanel1 یا panel1 یا groupBox1 یا ... قرار داده اید.
اون اسم ها کمک می کنه که راحت کنترل رو پیدا کنید، مثلا با flowLayoutPanel1.Controls["X"] و panel1.Controls["X"] و ... به کنترل x دسترسی دارید.
یعنی از روی Name شون راحت بهشون دسترسی پیدا می کنید.

شما یک کنترل طراحی کرده اید که داخلش یکسری کنترل فرزند داره، و حالا می خواهید امکان این باشه که چند نمونه از این کنترل مثلا زیر هم ردیف بشن و ...
برای کنترلی که شما طراحی کرده اید بستر مناسب کنترل هایی مثل FlowLayoutPanel و TableLayoutPanel ئه. البته با Panel و GroupBox هم میشه ولی در Panel و GroupBox برای قرارگیری کنترل ها باید موقعیت افقی عمودی شون رو خودتون تنظیم کنید. ولی چون FlowLayoutPanel ساختار ساده تری داره و تنظیم موقعیت خودکار ئه، معمولا انتخاب راحتی است.
صرفا در بعضی کاربرد ها که ظاهر پیچیده است، مثلا میخواهید ظاهر ستون بندی بشه و سمت چپ و وسط و بالا و پایین و ... موارد خاصی قرار بگیره، دیگه FlowLayoutPanel امکان تنظیم زیادی نداره و باید بجایش از TableLayoutPanel استفاده کنید که سطر و ستون بندی مجهز داره.

qasemf
دوشنبه 17 آذر 1399, 10:40 صبح
بله این کنترل ها در flowlayoutpanel دارن اضافه میشن و زیر هم قرار میگیرن اینکه هر شی یک نام داره درست ولی خب مثلا امکان داره ۵ تا کنترل همزمان داخل این پنل در حال اجرا باشن و کاربر بخواد فرضا ایتم چهارم رو stop کنه حالا اگه مثلا نام این باتن btn_stop باشه باید چطوری دسترسی پیدا کنیم به کنترل چهارم و بعد باتن stop رو بزنیم؟

the king
دوشنبه 17 آذر 1399, 11:18 صبح
بله این کنترل ها در flowlayoutpanel دارن اضافه میشن و زیر هم قرار میگیرن اینکه هر شی یک نام داره درست ولی خب مثلا امکان داره ۵ تا کنترل همزمان داخل این پنل در حال اجرا باشن و کاربر بخواد فرضا ایتم چهارم رو stop کنه حالا اگه مثلا نام این باتن btn_stop باشه باید چطوری دسترسی پیدا کنیم به کنترل چهارم و بعد باتن stop رو بزنیم؟
خیلی ساده، اگر با اندیس کار کنید، کنترل چهارم اندیس 3 داره (اندیس 0 برای کنترل اول) پس با flowLayoutPanel1.Controls[3] به اون کنترل چهارم دسترسی دارید.
اگر هم با نام کار کنید و Name اون کنترل چهارم رو "c4" قرار داده باشید با flowLayoutPanel1.Controls["c4"] به اون کنترل چهارم دسترسی دارید.
پس تا اینجا کد چیزی شبیه به این شد که MyUserControl باید نوع کنترل شما باشه، هر اسمی که هست :

var c = (MyUserControl) flowLayoutPanel1.Controls[3];

برای اینکه به اون Button داخلش هم دسترسی راحتی داشته باشید در موقع طراحی کنترل تون اون Button رو انتخاب کنید و مشخصه Modifiers رو روی Public قرار بدهید.
اینطوری فرضا با c.btn_stop به دکمه btn_stop دسترسی دارید.

Mahmoud.Afrad
سه شنبه 18 آذر 1399, 01:26 صبح
بله این کنترل ها در flowlayoutpanel دارن اضافه میشن و زیر هم قرار میگیرن اینکه هر شی یک نام داره درست ولی خب مثلا امکان داره ۵ تا کنترل همزمان داخل این پنل در حال اجرا باشن و کاربر بخواد فرضا ایتم چهارم رو stop کنه حالا اگه مثلا نام این باتن btn_stop باشه باید چطوری دسترسی پیدا کنیم به کنترل چهارم و بعد باتن stop رو بزنیم؟

براش رویداد ایجاد کنید که با کلیک اون رویداد فایر بشه.
برای انتقال اطلاعات به کنترل هایی مثل لیبل و پروگرسبار و ... هم پراپرتی ایجاد کنید.

qasemf
چهارشنبه 03 دی 1399, 14:33 عصر
براش رویداد ایجاد کنید که با کلیک اون رویداد فایر بشه.
برای انتقال اطلاعات به کنترل هایی مثل لیبل و پروگرسبار و ... هم پراپرتی ایجاد کنید.
ببینید من از backgroundworker استفاده میکردم زمانی که انتقال فایل انجام میشد!! برنامه اینطوری باید کار کنه زمانی که past رو میزنی یوزر کنترل فراخوانی میشه حالا این یوزر کنترل چند تا کنترل مثل پروگرس بار و تکست باکس و باتن داره!! حالا من میخوام زمانی که روی این باتن کلیک شد عملیات انتقال فایل انجام بشه !! سوالم اینه که backgroundworker رو کجا باید بنویسم ؟ داخل یوزر کنترل؟ یا داخل فرم؟ اگه داخل فرم بنویسم چطوری باید عمل کرد؟ چون رویداد کلیک رو داخل یوزر کنترل تعریف کردم ولی background worker داخل فرم

the king
چهارشنبه 03 دی 1399, 20:34 عصر
ببینید من از backgroundworker استفاده میکردم زمانی که انتقال فایل انجام میشد!! برنامه اینطوری باید کار کنه زمانی که past رو میزنی یوزر کنترل فراخوانی میشه حالا این یوزر کنترل چند تا کنترل مثل پروگرس بار و تکست باکس و باتن داره!! حالا من میخوام زمانی که روی این باتن کلیک شد عملیات انتقال فایل انجام بشه !! سوالم اینه که backgroundworker رو کجا باید بنویسم ؟ داخل یوزر کنترل؟ یا داخل فرم؟ اگه داخل فرم بنویسم چطوری باید عمل کرد؟ چون رویداد کلیک رو داخل یوزر کنترل تعریف کردم ولی background worker داخل فرم
در خود رخداد Click دکمه BackgroundWorker جدید بسازید، البته مزیت BackgroundWorker به سادگی قرار دادنش روی فرم ئه، اگر قرار باشه اینطوری BackgroundWorker با کد نویسی ایجاد بشه از کاربرد اصلیش دور میشه و ساختن Thread و Task و ... گزینه های مناسب تری هستند. ساختن BackgroundWorker در کد اینطوریه ولی اگر کسی بپرسه "چرا با BackgroundWorker؟" استدلالی برای دفاع ندارم :


private void button1_Click(object sender, EventArgs e)
{
progressBar1.Visible = true;
var bw = new BackgroundWorker();
bw.DoWork += Bw_DoWork;
bw.RunWorkerCompleted += Bw_RunWorkerCompleted;
bw.RunWorkerAsync();
}

private void Bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// Copy finished.
progressBar1.Visible = false;
((BackgroundWorker)sender).Dispose();
}

private void Bw_DoWork(object sender, DoWorkEventArgs e)
{
// Copy files...
}

qasemf
پنج شنبه 04 دی 1399, 02:36 صبح
براش رویداد ایجاد کنید که با کلیک اون رویداد فایر بشه.
برای انتقال اطلاعات به کنترل هایی مثل لیبل و پروگرسبار و ... هم پراپرتی ایجاد کنید.


در خود رخداد Click دکمه BackgroundWorker جدید بسازید، البته مزیت BackgroundWorker به سادگی قرار دادنش روی فرم ئه، اگر قرار باشه اینطوری BackgroundWorker با کد نویسی ایجاد بشه از کاربرد اصلیش دور میشه و ساختن Thread و Task و ... گزینه های مناسب تری هستند. ساختن BackgroundWorker در کد اینطوریه ولی اگر کسی بپرسه "چرا با BackgroundWorker؟" استدلالی برای دفاع ندارم :


private void button1_Click(object sender, EventArgs e)
{
progressBar1.Visible = true;
var bw = new BackgroundWorker();
bw.DoWork += Bw_DoWork;
bw.RunWorkerCompleted += Bw_RunWorkerCompleted;
bw.RunWorkerAsync();
}

private void Bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// Copy finished.
progressBar1.Visible = false;
((BackgroundWorker)sender).Dispose();
}

private void Bw_DoWork(object sender, DoWorkEventArgs e)
{
// Copy files...
}


ممنون
بعد این بحث pause resume و skip رو توی پروگس بار چطوری باید پیاده کرد؟

the king
پنج شنبه 04 دی 1399, 03:20 صبح
ممنون
بعد این بحث pause resume و skip رو توی پروگس بار چطوری باید پیاده کرد؟

نمیدونم منظورتون از Skip چیه، ولی اگر هدف رد شدن از کپی بعضی فایل ها است، ربطی به خود BackgroundWorker یا ProgressBar نداره.
می توانید با تغییر مقدار یک متغیر یا دستکاری در یک لیست فایل ها پیاده اش کنید.

اما اگر میخواهید روال کپی رو با یک کلیک Cancel یا Abort کنید، اولا باید WorkerSupportsCancellation رو true کنید :

private void button1_Click(object sender, EventArgs e)
{
progressBar1.Visible = true;
var bw = new BackgroundWorker();
bw.WorkerSupportsCancellation = true;
bw.DoWork += Bw_DoWork;
bw.RunWorkerCompleted += Bw_RunWorkerCompleted;
bw.RunWorkerAsync();
}

و بعد هر جا که لازمه Cancel کنید، با ()bw.CancelAsync به BackgroundWorker ئه پیام می دهید که لطفا متوقف شو. این صرفا پیام ئه، خودش کاری انجام نمیده.
بعد در کد داخل Bw_DoWork هم خودتون باید چک کنید که اگه CancellationPending اش true شده حرف گوش کنه و کپی رو متوقف کنه.
توقف دست خودتونه و به کدتون بستگی داره، می توانید به درخواست توجه نکنید و روال ادامه پیدا کنه.

private void Bw_DoWork(object sender, DoWorkEventArgs e)
{
foreach (var file in files)
{
if (((BackgroundWorker)sender).CancellationPending)
{
return;
}
// Copy file...
}
}


برای Pause و Resume هم می توانید یک فیلد اختصاص بدهید که اگر مقدارش true شد داخل Bw_DoWork تا وقتی true ئه داخل یک حلقه چرت بزنه.
مثلا با ;System.Threading.Thread.Sleep(100) و موقع Pause مقدار متغیر ئه رو true کنید و موقع Resume مقدارش رو false کنید.


private bool _pause;

private void Bw_DoWork(object sender, DoWorkEventArgs e)
{
foreach (var file in files)
{
if (((BackgroundWorker)sender).CancellationPending)
{
return;
}
while (_pause)
{
System.Threading.Thread.Sleep(100);
}
// Copy file...
}
}

qasemf
جمعه 05 دی 1399, 03:52 صبح
نمیدونم منظورتون از Skip چیه، ولی اگر هدف رد شدن از کپی بعضی فایل ها است، ربطی به خود BackgroundWorker یا ProgressBar نداره.
می توانید با تغییر مقدار یک متغیر یا دستکاری در یک لیست فایل ها پیاده اش کنید.

اما اگر میخواهید روال کپی رو با یک کلیک Cancel یا Abort کنید، اولا باید WorkerSupportsCancellation رو true کنید :

private void button1_Click(object sender, EventArgs e)
{
progressBar1.Visible = true;
var bw = new BackgroundWorker();
bw.WorkerSupportsCancellation = true;
bw.DoWork += Bw_DoWork;
bw.RunWorkerCompleted += Bw_RunWorkerCompleted;
bw.RunWorkerAsync();
}

و بعد هر جا که لازمه Cancel کنید، با ()bw.CancelAsync به BackgroundWorker ئه پیام می دهید که لطفا متوقف شو. این صرفا پیام ئه، خودش کاری انجام نمیده.
بعد در کد داخل Bw_DoWork هم خودتون باید چک کنید که اگه CancellationPending اش true شده حرف گوش کنه و کپی رو متوقف کنه.
توقف دست خودتونه و به کدتون بستگی داره، می توانید به درخواست توجه نکنید و روال ادامه پیدا کنه.

private void Bw_DoWork(object sender, DoWorkEventArgs e)
{
foreach (var file in files)
{
if (((BackgroundWorker)sender).CancellationPending)
{
return;
}
// Copy file...
}
}


برای Pause و Resume هم می توانید یک فیلد اختصاص بدهید که اگر مقدارش true شد داخل Bw_DoWork تا وقتی true ئه داخل یک حلقه چرت بزنه.
مثلا با ;System.Threading.Thread.Sleep(100) و موقع Pause مقدار متغیر ئه رو true کنید و موقع Resume مقدارش رو false کنید.


private bool _pause;

private void Bw_DoWork(object sender, DoWorkEventArgs e)
{
foreach (var file in files)
{
if (((BackgroundWorker)sender).CancellationPending)
{
return;
}
while (_pause)
{
System.Threading.Thread.Sleep(100);
}
// Copy file...
}
}


اره منظورم دقیقا رد شدن از کپی بعضی فایل ها بود فقط برای pause داخل رویداد کلیک pause بعد از ایکنه اون متغیر رو true کردیم چی باید بگیم؟ منظورم اینه چطوری do work رو صدا بزنیم؟

the king
جمعه 05 دی 1399, 16:32 عصر
اره منظورم دقیقا رد شدن از کپی بعضی فایل ها بود فقط برای pause داخل رویداد کلیک pause بعد از ایکنه اون متغیر رو true کردیم چی باید بگیم؟ منظورم اینه چطوری do work رو صدا بزنیم؟

نه، دیگه DoWork رو مجددا صدا نمی زنید، قبلا صدا زده بودنیش که کپی شروع شده. همون true کردن متغیر pause_ به تنهایی باعث توقف روالی میشه که DoWork داره انجام میده. مادامی که pause_ ئه true هست روال متوقف میمونه. هر وقت به قصد resume متغیر ئه رو false کنید از همونجا که متوقف شده بود ادامه میده و باز نیازی به فراخوانی DoWork نیست.

qasemf
شنبه 06 دی 1399, 14:15 عصر
کدی که گفته بودین رو نوشتم اما اتفاقی رخ نمیده

qasemf
شنبه 06 دی 1399, 14:24 عصر
نه، دیگه DoWork رو مجددا صدا نمی زنید، قبلا صدا زده بودنیش که کپی شروع شده. همون true کردن متغیر pause_ به تنهایی باعث توقف روالی میشه که DoWork داره انجام میده. مادامی که pause_ ئه true هست روال متوقف میمونه. هر وقت به قصد resume متغیر ئه رو false کنید از همونجا که متوقف شده بود ادامه میده و باز نیازی به فراخوانی DoWork نیست.

private void Worker_DoWork(object sender, DoWorkEventArgs e)
{

var dest = Path.GetFullPath(txt_usercontrol.Text );
var list = new List<KeyValuePair<string, string>>();
foreach (var item in replacementList)
{
list.Add(new KeyValuePair<string, string>(item, dest));
}

for (var i = 0; i < list.Count; i++)

{
if (Directory.Exists(list[i].Key))
{
var destFolder = Path.Combine(list[i].Value, Path.GetFileName(list[i].Key));
if (Directory.Exists(destFolder) == false)
{
Directory.CreateDirectory(destFolder);
}
foreach (var file in Directory.GetFiles(list[i].Key))
{

list.Add(new KeyValuePair<string, string>(file, destFolder));


}
foreach (var folder in Directory.GetDirectories(list[i].Key))
{
list.Add(new KeyValuePair<string, string>(folder, destFolder));
}
}
else if (File.Exists(list[i].Key))
{

var destFile = Path.Combine(list[i].Value, Path.GetFileName(list[i].Key));
Copy(list[i].Key, destFile);
}

}
}



ببینید این do work هست اون کدی که شما فرمودین رو هر جایی که مینویسم اتفاقی رخ نمیده مشکل کجاست به نظر شما؟

private void btn_pause_Click(object sender, EventArgs e)
{
if (btn_pause.Text == "pause")
{
_pause = true;
btn_pause.Text = "resume";
}
else
{
_pause = false;
btn_pause.Text = "pause";
}

}

برام سواله do work چطوری میفهمه متغیر true شده

the king
شنبه 06 دی 1399, 19:05 عصر
private void Worker_DoWork(object sender, DoWorkEventArgs e)
{

var dest = Path.GetFullPath(txt_usercontrol.Text );
var list = new List<KeyValuePair<string, string>>();
foreach (var item in replacementList)
{
list.Add(new KeyValuePair<string, string>(item, dest));
}

for (var i = 0; i < list.Count; i++)

{
if (Directory.Exists(list[i].Key))
{
var destFolder = Path.Combine(list[i].Value, Path.GetFileName(list[i].Key));
if (Directory.Exists(destFolder) == false)
{
Directory.CreateDirectory(destFolder);
}
foreach (var file in Directory.GetFiles(list[i].Key))
{

list.Add(new KeyValuePair<string, string>(file, destFolder));


}
foreach (var folder in Directory.GetDirectories(list[i].Key))
{
list.Add(new KeyValuePair<string, string>(folder, destFolder));
}
}
else if (File.Exists(list[i].Key))
{

var destFile = Path.Combine(list[i].Value, Path.GetFileName(list[i].Key));
Copy(list[i].Key, destFile);
}

}
}



ببینید این do work هست اون کدی که شما فرمودین رو هر جایی که مینویسم اتفاقی رخ نمیده مشکل کجاست به نظر شما؟

private void btn_pause_Click(object sender, EventArgs e)
{
if (btn_pause.Text == "pause")
{
_pause = true;
btn_pause.Text = "resume";
}
else
{
_pause = false;
btn_pause.Text = "pause";
}

}

برام سواله do work چطوری میفهمه متغیر true شده
آخه شرطش رو از قلم انداخته اید.
ببینید در مثال من یه while (_pause) بود با یک Sleep(100) داخلش؟ اون رو از قلم انداخته اید.
داخل حلقه for (var i = 0; i < list.Count; i++) تون و پیش از سایر کد ها اون while (_pause) و Sleep(100) داخلش رو اضافه کنید.

qasemf
یک شنبه 07 دی 1399, 01:50 صبح
آخه شرطش رو از قلم انداخته اید.
ببینید در مثال من یه while (_pause) بود با یک Sleep(100) داخلش؟ اون رو از قلم انداخته اید.
داخل حلقه for (var i = 0; i < list.Count; i++) تون و پیش از سایر کد ها اون while (_pause) و Sleep(100) داخلش رو اضافه کنید.
همون اول شرط رو گذاشتم جواب نداد ولی خب اینظوری حلش کردم




for (int i = 0; i < 100; i++)
{


locker.WaitOne();
Thread.Sleep(100);
worker.ReportProgress(i);


if (worker.CancellationPending)
{
e.Cancel = true;
worker.ReportProgress(0);
return;
}
}


البته زمانی که pause زده میشه باید locker.Reset(); و زمان resume هم باید locker.Reset(); رو بنویسیم
عذر میخوام تا الان اگه شما نبودین مشکلاتم رو نمیتونستم رفع کنم
برای درگ و دراپ کردن فایل ها چطور میشه عمل کرد مثلا زمانی که انتقال فایل در حال انجام هست چطور میشه یک فایل رو درگ کنیم و بندازیم داخل پروگرس بار؟ یا زمانی که میخوایم تعدادی فایل رو از داخل لیست ویو درگ کنیم و داخل یه فولدر دیگه بندازیم

the king
یک شنبه 07 دی 1399, 02:18 صبح
همون اول شرط رو گذاشتم جواب نداد ولی خب اینظوری حلش کردم




for (int i = 0; i < 100; i++)
{


locker.WaitOne();
Thread.Sleep(100);
worker.ReportProgress(i);


if (worker.CancellationPending)
{
e.Cancel = true;
worker.ReportProgress(0);
return;
}
}


البته زمانی که pause زده میشه باید locker.Reset(); و زمان resume هم باید locker.Reset(); رو بنویسیم
عذر میخوام تا الان اگه شما نبودین مشکلاتم رو نمیتونستم رفع کنم
برای درگ و دراپ کردن فایل ها چطور میشه عمل کرد مثلا زمانی که انتقال فایل در حال انجام هست چطور میشه یک فایل رو درگ کنیم و بندازیم داخل پروگرس بار؟ یا زمانی که میخوایم تعدادی فایل رو از داخل لیست ویو درگ کنیم و داخل یه فولدر دیگه بندازیم
منطق کدی که نوشته اید رو درک نمی کنم، Sleep رو بدون شرط دارید اعمال می کنید، یعنی برای هر 100 مورد تکرار حلقه Sleep دارید، جمعا ده ثانیه مکث می کنه، با چه هدفی؟

برای Drag Drop مطالبی مثل اینها رو ببینید :
سوال: یک نمونه کدی و یا آموزش درباره درگ و داپ کردن (https://barnamenevis.org/showthread.php?410309-%DB%8C%DA%A9-%D9%86%D9%85%D9%88%D9%86%D9%87-%DA%A9%D8%AF%DB%8C-%D9%88-%DB%8C%D8%A7-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%AF%D8%B1%D8%A8%D8%A7%D8%B1%D9%87-%D8%AF%D8%B1%DA%AF-%D9%88-%D8%AF%D8%A7%D9%BE-%DA%A9%D8%B1%D8%AF%D9%86)
باز کردن چند فایل به طور همزمان بدون استفاده از OpenFileDialog (https://barnamenevis.org/showthread.php?237002-%D8%A8%D8%A7%D8%B2-%DA%A9%D8%B1%D8%AF%D9%86-%DA%86%D9%86%D8%AF-%D9%81%D8%A7%DB%8C%D9%84-%D8%A8%D9%87-%D8%B7%D9%88%D8%B1-%D9%87%D9%85%D8%B2%D9%85%D8%A7%D9%86-%D8%A8%D8%AF%D9%88%D9%86-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-OpenFileDialog)

qasemf
یک شنبه 07 دی 1399, 14:39 عصر
منم خودم موندم ولی تست کردم تا یک ساعتم تست کردم درست کار میکنه ببینید زمانی که pause رو میزنیم locker رو ریست میکنیم چون مقدار اولیه locker رو true قرار دادیم( locker یک ManualResetEvent هست) بنابراین شرط ما locker هست که وقتی ریست شد میتونیم با فراخوانی()locker.WaitOn شرط رو برقرار کنیم همین که شرط برقرار شد (100)Thread Sleep روال رو متوقف میکنه فقط خودمم موندم این ۱۰۰ واقعا چکار میکنه به قول شما ۱۰ ثانیه بیشتر نباید بشه ولی تا یه ساعتم چک کردم روال متوقف مونده

the king
یک شنبه 07 دی 1399, 15:35 عصر
منم خودم موندم ولی تست کردم تا یک ساعتم تست کردم درست کار میکنه ببینید زمانی که pause رو میزنیم locker رو ریست میکنیم چون مقدار اولیه locker رو true قرار دادیم( locker یک ManualResetEvent هست) بنابراین شرط ما locker هست که وقتی ریست شد میتونیم با فراخوانی()locker.WaitOn شرط رو برقرار کنیم همین که شرط برقرار شد (100)Thread Sleep روال رو متوقف میکنه فقط خودمم موندم این ۱۰۰ واقعا چکار میکنه به قول شما ۱۰ ثانیه بیشتر نباید بشه ولی تا یه ساعتم چک کردم روال متوقف مونده
اون (100)Sleep میگه به مدت 100 میلی ثانیه (یک دهم ثانیه) بخواب و بعد بیدار شو، یعنی DoWork به مدت 100 میلی ثانیه مکث کنه و بعد مجددا کارش رو ادامه بده.
معمولا در جایی که میخوان یک شرط رو مدام بررسی کنند و نمیخوان این بررسی های مکرر فشار به پردازنده بیاره، بین بررسی ها یک مکث کوتاه ایجاد می کنند تا در اون فاصله (که البته از دید پردازنده زمان زیادیه، میتونه در اون 100 میلی ثانیه میلیارد ها دستور اجرا بشه) کاری به پردازنده نداشته باشه.
اگر مساله رو با ManualResetEvent حل کرده باشید قاعدتا اون Sleep اضافیه و نیازی به مکث با Sleep نیست.

qasemf
یک شنبه 07 دی 1399, 23:11 عصر
اخه همون اول تست کردم واقعا برام جالبه گاهی وقتها یه چیزایی برام مبهمه اون sleep رو که برداری توقف صورت نمیگیره!!! موندم اون sleep دقیقا چه کاری انجام میده وقتی ManualResetEvent هست ولی واقعا تست کردم و جواب نداد واسه همین چون کارمو راه انداخت گفتم اشکال نداره به هر حال بازم ممنونم