PDA

View Full Version : ساخت یک فرم loading ابتدای برنامه ( thread )



once4ever
چهارشنبه 10 خرداد 1385, 14:51 عصر
میخوام یک فرم loading ابتدای برنامه ام درست کنم بطوریکه فایلهای مورد نیاز رو چک کنه و یک دیتا ست رو پر کنه. در موقع انجام این کارها باید فرم نمایش داده بشه و مثلا چندتا نقطه چین کم و زیاد بشه. و بعد از اینکه موارد load شدند برنامه چندتا فرم تو همون کنترل اضافه کنه برای ادامه کار.
فکرکنم از threading باید استفاده بشه ولی تاحالا کار نکردم باهاش!
یک thread ساختم که یک فایلی رو که دیتاست پر میکنه اجرا میکنه. این ترد کجا باید اجرا بشه؟ و بعضی کارها مثل visible کردن رو اشکال میگیره. چجوری چک کنم که کارش تموم شد و حالا کارهای دیگرو انجام بده؟

ممنون

محمد میرمصطفی
پنج شنبه 11 خرداد 1385, 23:13 عصر
شما دوتا راه (تا اونجا که من میدونم) داری:
1- یه فرم Initializer بساز که تمام این کارا رو انجام بده. بعد توی MainFormت یه Thread بسازی و توی اون Thread، فرم Initializer رو new و show کنی و بزاری کارشو بکنه.
2- توی Threadت هر جا که لازم باشه فرمی رو Update منه، اون کنترل خاص رو Invoke کن.

Amir Oveisi
پنج شنبه 11 خرداد 1385, 23:51 عصر
من خودم با invoke کار کردم تو یه تابع چک میکنی که اون کنترل مورد نظرت invoke میخواد یا نه بعد اگه آره اون کارایی که میخوایی تو هر invoke انجام بشه رو مینویسی تو تابع

once4ever
جمعه 12 خرداد 1385, 10:20 صبح
1- یه فرم Initializer بساز که تمام این کارا رو انجام بده. بعد توی MainFormت یه Thread بسازی و توی اون Thread، فرم Initializer رو new و show کنی و بزاری کارشو بکنه. میخوام تا وقتی load نشده فقط فرم loading نمایش داده بشه و بنویسه چه چیزهایی درحال لود شدن هستند. و جز فرم لودینگ چیزی اول برنامه اجرا نشه!


2- توی Threadت هر جا که لازم باشه فرمی رو Update منه، اون کنترل خاص رو Invoke کن. فکر نکنم همچین چیزی بخوام!
این invok دقیقا چیه؟

میخوام Text یک label رو عوض کنم. با invoke چجوری انجام میشه؟!

Amir Oveisi
جمعه 12 خرداد 1385, 12:41 عصر
خوب فرض کنیم اسم label باشه lbl اینجوری مینویسی فکر کنم :

if( lbl.InvokeRequired() )
{
//codes to change your texts
}
اینو تو یه تابع مینویسی بعد این تابع رو تو thread فراخونی میکنی
فکر کنم درست گفته باشم :متفکر:

once4ever
جمعه 12 خرداد 1385, 14:49 عصر
حتما درست گفتی ولی ناقص گفتی یا من نفهمیدم! ;)
این عبارت کی true میشه؟ ()lbl.InvokeRequired
وقتی به این if میرسه ازکجا میفهمه true هست یا false ؟

Amir Oveisi
جمعه 12 خرداد 1385, 23:17 عصر
خوب... اول باید یه thread درست کنیم که یه تابع بهش نسبت داده شده ( با استفاده از delegate ) بعدش فرض کنیم اسم thread باشه A و اسم اون تابعش باشه B. حالا اون کارهایی که میخوای تو تابع B انجام بشن اگه با یه کنترل سر و کار داشته باشن نمیشه تو همون تابع B نوشتش باید تو یه تابع دیگه بنویسی و اون تابع رو تو تابع B فراخونی کنی. مثلا اسم تابعی که میخوای Label1 رو تغییراتی روش بده میذاریم C . و تابع C رو اینجوری تعریف میکنیم :


void C()
{
if(Label1.InvokeRequirde() )
{
//codes to edit Label1 go here
}
}
حالا تو تابع B هر جا بخوای با Label1 کار کنی ای تابع C رو فراخونی میکنی و چون تابع از طرف یه thread فراخونی شده InvokeRequired بطور خودکار مقدار بر میگردونه. من خودم از این واسه کار با Label و Progress Bar استفاده کردم و درست جواب داده.
امیدوارم تونسته باشم توضیح بدم :متفکر:

once4ever
شنبه 13 خرداد 1385, 00:15 صبح
چون تابع از طرف یه thread فراخونی شده InvokeRequired بطور خودکار مقدار بر میگردونه. من دنبال همین بودم. از توضیح کاملت ممنون ;)
اینقدرم چونتو نخارون کنده میشه دیگه نداریو ;))
موفق باشی

بازم همون اشکالو گرفت! میگه دوتا thread نمیتونند باهم اجرا بشن!
من این تابع رو حالت عادی تو تابعی که با ترد اجرا شده بود صدازدم. ولی مثل قبل از خط lable1.text="loading...";s اشکال گرفت!

Amir Oveisi
شنبه 13 خرداد 1385, 02:12 صبح
تو اون کدی که مینویسی که نوشته label رو تغییر بده اینجوری باید باشه :

public delegate void MyDelegate();
Thread StartThread = null;
StartThread = new Thread(new ThreadStart(this.Start));
public void Start()
{
//som codes here
ShowProgress();
}
public void ShowProgress()
{
if (pgs1.InvokeRequired)
{
MyDelegate del = new MyDelegate(this.ShowProgress);
Invoke(del);
}
else if (pgs1.Value < pgs1.Maximum)
{
int percent = 100 * pgs1.Value / pgs1.Maximum + 1;
toolStripStatusLabelPercent.Text = " " + percent.ToString() + " %";
pgs1.Value += 1;
toolStripProgressBar1.Value = pgs1.Value;
toolStripStatusLabelStatus.Text = "Creating...";
}
}

امیدوارم با این نمونه مشکلت حل بشه (یکی از برنامه های خودمه که progress Bar رو update میکنه)

once4ever
شنبه 13 خرداد 1385, 10:36 صبح
اینجا که تابع ()ShowProgress فقط یکبار اجرا میکنه!
(درضمن نفهمیدم pgs1 چیه تو برنامه ات؟ اگه progress پس اون یکیش چیه! مهم نیست البته)

میتونی یک کد بذاری اینجا که تا وقتی یک thread انجام میشه به یک label نقطه اضافه کنه و وقتی thread کامل شد تو label بنویسه complete ؟
ممنون از راهنماییت

once4ever
یک شنبه 14 خرداد 1385, 01:27 صبح
منم همه سورس رو نمیخوام!
ممنون از کمکت.
مشکل من اینه:

یک کد بذاری اینجا که تا وقتی یک thread انجام میشه به یک label نقطه اضافه کنه و وقتی thread کامل شد تو label بنویسه complete

Amir Oveisi
یک شنبه 14 خرداد 1385, 02:46 صبح
اینو نوشتم ولی واسه این کار بهتره از TimerCallBack استفاده بشه ( اکه بخوای با زمان نقطه بیاد و بره البته ) ولی من یجوری نوشتم که مثلا یه کاری انجام میده که طول میکشخ و همزمان با اون میخواد نقطه بذاره


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace Thread_Label
{

public partial class Form1 : Form
{
Thread myThread = null;
public delegate void myDel();
int i = 0;

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
myThread = new Thread(new ThreadStart(this.Start));
myThread.Start();
}
public void Start()
{

for( i=0 ;i<=1000000;i++)
TextChange();
}
public void TextChange()
{
try
{
if (label1.InvokeRequired)
{

myDel myDelegate = new myDel(this.TextChange);
Invoke(myDelegate);
}
else
{

if (i % 5000 == 0)
{
if (label1.Text == "Please wait ...")
label1.Text = "Please wait ";
else
label1.Text += ".";
}


}
}

catch(Exception e)
{
MessageBox.Show(e.Message);
}

}



private void button2_Click(object sender, EventArgs e)
{
myThread.Abort();

}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
myThread.Abort();
}
}
}
اگه هم خواستی که بعد از تموم شدن کار حلقه for بنویسه که کامل شده میتونی تو تابعی که هست (TextChange) یه شرط بذاری

امیدوارم به دردت بخوره موفق باشی

once4ever
یک شنبه 14 خرداد 1385, 11:13 صبح
ممنون. ولی این کدی که نوشتی درست نیست! این حلقه for یعنی یه کاری که زمان میبره ولی هیچوقت ما از for استفاده نمیکنیم. پس باید TextChange خارج از تکرار باشه.
مشکل من هم همین هست که با چه شرطی میتونیم چک کنیم که هنوز ترد داره کار میکنه و با چه شرطی میتونیم بفهمیم که ترد کارش تموم شده.
از IsAlive استفاده کردم ولی جواب نداد!

Amir Oveisi
دوشنبه 15 خرداد 1385, 00:04 صبح
ببین دوست عزیز من نمیدونم دقیقا thread شما برای انجام چه کاریه یهنی نمیدونم چه کارهایی باید همزمان انجام بشن فقط اینو میدونم که یکی از این کاره اینه که label رو نوشتشو عوض کنه حالا ابن100% به کار بعدی بستگی داره که چی باشه من چون نمیدونستم اون کارت چی هست به جاش اون حلقه رو گذاشتم حالا شما اون کارهات رو میذاری به جای حلقه و اینم هست که خودت باید مشخص کنی که thread کی متوقف میشه. و یه نکته دیگه اینه که اگه اون یکی کار که میخوای موازی با این label باشه بخوای بر اساس زمان عمل کنه باید از TimerCallBack استفاده کنی که خودش یه thread هستش.

once4ever
دوشنبه 15 خرداد 1385, 00:21 صبح
دوست من احتمالا متوجه منظورم نشدی.
-توضیحاتشو تو پست قبلیم نوشتم- کد هیچ اشکالی نداره ولی تابعی که به لیبل نقطه اضافه میکنه با یک for اجرا شده و تکرار میشه و وابسته به شمارنده for هست و نه به کاری که تو ترد انجام میشه....

درهرصورت ممنون کمک بزرگی کردی.

Amir Oveisi
دوشنبه 15 خرداد 1385, 00:27 صبح
اصولا ترد ها زمانی استفاده میشن که بخوایم چند کار همزمان انجام بشن ولی اینجا شما فقط یه کارشو گفتین که چیه اگه کار دوم رو هم دقیق بگین احتمال اینکه دوستای دیگه هم بتونن دقیق تر کمک کنن بیشتر میشه... ممنون

dr_jacky_2005
یک شنبه 28 شهریور 1389, 08:27 صبح
اصولا ترد ها زمانی استفاده میشن که بخوایم چند کار همزمان انجام بشن ولی اینجا شما فقط یه کارشو گفتین که چیه اگه کار دوم رو هم دقیق بگین احتمال اینکه دوستای دیگه هم بتونن دقیق تر کمک کنن بیشتر میشه... ممنون

آقا میشه لطف کنی واسه ما تازه کارا یه نمونه مثال کامل که کار میکنه بزاری؟:قلب:

r.dizin
یک شنبه 07 آذر 1389, 08:50 صبح
سلام
من يك برنامه دارم كه هنگام اجرا يكسري فايل رو آپلود ميكنه در حين اين كار روي فرم ديگه فايلهايي كه دارن كپي ميشه رو نشون ميده من چطور ميتونم اينكار رو انجام بدم لطفا كمكم كنيد

با تشكر