PDA

View Full Version : اشكال در تعامل threading و كنترل هاي ويندوزي



yasercomeng
پنج شنبه 07 شهریور 1387, 00:13 صبح
سلام من يه برنامه نوشتم كه از دو تا فرم تشكليل شده فرم اول فرم دوم را با متد Show() نمايش مي دهد تا قابليت حركت بين اين دو فرم فراهم شود. مادامي كه فرم اول كار خودشو انجام مي ده مي خوام كه فرم دوم يه سري اطلاعات رو از پايگاه بهم نشون بده مثلاً اگه فرض كنيم كه ما وارد فرم مدير شديم مي خوايم كه تو فرم دوم ميزان فروش يك ساعت پيش را ملاحظه كنيم. خب براي اين كار من مي خوام از threading استفاده كنم اما يه كمي دچار مشكل شدم. در واقع به نظر مدل كدينگم اشتباه است. حالا كمكي كه از شما مي خوام اينه كه كدا رو ببينيد بهم بگين براي اين كار بايد چه كار كنم. از راهنماييتون متشكرم.

اين كد رويداد Load مربوط به فرم مدير:

private void manager_Load(object sender, EventArgs e)
{
ManagerNotifyCost MNC = new ManagerNotifyCost();
MNC.Show();
}

اينم كد مربوط به فرم ManagerNotifyCost

يه نكته اينكه من تو اين كد من از دو تا ليبل (PlaceLablel,CostLabel) براي نمايش اطلاعات استفاده مي كنم.
يه نكته ي ديگه اين فرم وقتي تك باشد به درستي اعمالش رو انجام مي ده ولي وقتي با اون متد show فراخواني مي شه ديگه درست كار نمي كنه:

public partial class ManagerNotifyCost : Form
{
delegate void SetTextCallBack(string Cost, string Place);
MySqlCommand Command = new MySqlCommand();
MySqlConnection Connection=new MySqlConnection(/*my connection string*/);
MySqlDataReader Reader;
public ManagerNotifyCost()
{
InitializeComponent();
}

private void ManagerNotifyCost_Load(object sender, EventArgs e)
{
Thread ShowCost = new Thread(new ThreadStart(ShowingCost));
ShowCost.Start();
}

private void SetText(string Cost, string Place)
{
if (PlaceLabel.InvokeRequired)
{
SetTextCallBack Text = new SetTextCallBack(SetText);
this.Invoke(Text, new object[] { Cost, Place });
}
else
{
this.CostLabel.Text = "فروشگاه";
this.PlaceLabel.Text = Cost;
break;
}
}

private void ShowingCost()
{
lock (this)
{
int Cost = 0;
Command.Connection = library.Connection;
while (this.Visible)
{
Connection.Open();
Cost = 0;
//this is a place that information retrieve from DB
this.SetText(Cost.ToString(), "shop");
Connection.Close();
}
}
}
}

razavi_university
پنج شنبه 07 شهریور 1387, 02:37 صبح
http://www.barnamenevis.org/forum/images/icons/icon4.gif کار با کنترل های تولید شده توسط یک Thread‌از طریق Thread ی دیگر (http://barnamenevis.org/forum/showpost.php?p=474172)

موفق باشید

yasercomeng
جمعه 08 شهریور 1387, 01:57 صبح
ببينيد من به اين موضوع كاملاً واقف هستم چون تويه كد خودم هم از اين روش استفاده كردم.اگر كمي دقت مي كرديد متوجه مي شديد مشكل اصلي زماني است كه ما با دو فرم كار مي كنيم و مي خواهيم اطلاعات فرم دوم را به همراه فرم اول نشان دهيم (اطلاعاتي كه همواره در حال تغيير است) وقتي فرم دوم نمايش داده مي شود (load مي شود( نخ فرم دوم شروع به كار مي كند و همزمان با آن نخ اصلي برنامه از روي فراخواني MNC.Show() گذر مي كند اما نخي كه در اين فرم قرار دارد هنوز در حال كار كردن است و اين باعث مي شود كه فرم دوم به حالت Not-Responding برود اما هنوز مي توان با فرم اول كار كرد.