PDA

View Full Version : اضافه کردن ToolstripComboBox به ToolStrip باعث freeze شدن UI میشود.



FastCode
چهارشنبه 09 اردیبهشت 1394, 09:18 صبح
سلام.
این یکی رو واقعا نمیدونم باید چکار کنم:
void LoadToolStrips ()
{
ToolStripPanel leftPanel = new ToolStripPanel { Dock = DockStyle.Left };
ToolStripPanel topPanel = new ToolStripPanel { Dock = DockStyle.Top };
Controls.Add (leftPanel);
Controls.Add (topPanel);

ToolStrip ts = new ToolStrip { Dock = DockStyle.Fill, Name = "Primary" };
ToolStripLabel tslblMode = new ToolStripLabel ("حالت");
ToolStripButton tsbtnSave = new ToolStripButton ("ذخیره");
ToolStripButton tsbtnRollback = new ToolStripButton ("بازگشت");
tsbtnSave.Click += tsbtnSaveClick;
tsbtnRollback.Click += tsbtnRollbackClick;
ToolStripComboBox tscomboMode = new ToolStripComboBox ("tscomboMode");
foreach (var t in categories) {
tscomboMode.ComboBox.Items.Add (t.Key);//t.Key is string
}
ToolStripButton tsbtnHelp = new ToolStripButton ("راهنما", System.Drawing.SystemIcons.Question.ToBitmap (), (sender, e) => showHelpDialog (), "tsbtnHelp");
ts.Items.Add (tslblMode);
ts.Items.Add (tscomboMode);
ts.Items.Add (tsbtnSave);
ts.Items.Add (tsbtnRollback);
ts.Items.Add (tsbtnHelp);
topPanel.Controls.Add (ts);
tscomboMode.ComboBox.SelectionChangeCommitted += tscomboModeSelectedIndexChanged;

}

محمد آشتیانی
چهارشنبه 09 اردیبهشت 1394, 11:01 صبح
سلام
کد شما رو تست کردم و مشکلی هم نداشت البته ، همه چیز به خوبی کار میکنه
احتمال داره شما توی Event Handler ها کدی نوشته باشی که باعث این مسئله میشه ، چون من نهایتا در Event Handler های مربوط به باتن ها یک MessageBox نوشتم که پیغامی نمایش بده و برای کمبو باکس هم SelectedIndex رو نمایش دادم.
ممکنه در ترد دیگه ای به این کمبوباکس بخواید دسترسی پیدا کنید و یا چیزی شبیه به این مسئله که داره ایجاد مشکل میکنه.



موفق باشید.

FastCode
چهارشنبه 09 اردیبهشت 1394, 11:17 صبح
سلام
کد شما رو تست کردم و مشکلی هم نداشت البته ، همه چیز به خوبی کار میکنه
احتمال داره شما توی Event Handler ها کدی نوشته باشی که باعث این مسئله میشه ، چون من نهایتا در Event Handler های مربوط به باتن ها یک MessageBox نوشتم که پیغامی نمایش بده و برای کمبو باکس هم SelectedIndex رو نمایش دادم.
ممکنه در ترد دیگه ای به این کمبوباکس بخواید دسترسی پیدا کنید و یا چیزی شبیه به این مسئله که داره ایجاد مشکل میکنه.



موفق باشید.

سلام.
خیلی متشکرم برای تستی که انجام دادید.
متاسفانه همه کد همینه و هیچ کدی در event ها نوشته نشده.
تنها خطی که باعث freeze میشه مربوط به Add کردن tscomboMode هست.
واقعا مسئله عجیبیه.

plus
چهارشنبه 09 اردیبهشت 1394, 17:31 عصر
من کد شما رو با کمی تغییر (برای اینکه بتونم اجرا کنم)، اجرا کردم مشکلی نداشت:

void LoadToolStrips() {
ToolStripPanel leftPanel = new ToolStripPanel { Dock = DockStyle.Left };
ToolStripPanel topPanel = new ToolStripPanel { Dock = DockStyle.Top };
Controls.Add(leftPanel);
Controls.Add(topPanel);

ToolStrip ts = new ToolStrip { Dock = DockStyle.Fill, Name = "Primary" };
ToolStripLabel tslblMode = new ToolStripLabel("حالت");
ToolStripButton tsbtnSave = new ToolStripButton("ذخیره");
ToolStripButton tsbtnRollback = new ToolStripButton("بازگشت");
//tsbtnSave.Click += tsbtnSaveClick;
//tsbtnRollback.Click += tsbtnRollbackClick;
ToolStripComboBox tscomboMode = new ToolStripComboBox("tscomboMode");
string[] categories = new string[] { "A", "B", "C" };
foreach (var t in categories) {
tscomboMode.ComboBox.Items.Add(t);//t.Key is string
}
ToolStripButton tsbtnHelp = new ToolStripButton("راهنما", System.Drawing.SystemIcons.Question.ToBitmap(), null, "tsbtnHelp");
ts.Items.Add(tslblMode);
ts.Items.Add(tscomboMode);
ts.Items.Add(tsbtnSave);
ts.Items.Add(tsbtnRollback);
ts.Items.Add(tsbtnHelp);
topPanel.Controls.Add(ts);

}


در چه محیطی (ورژن فریم ورک) کار میکنید؟
سعی کردین کدهای اضافه رو مرحله مرحله حذف کنید و ببینید بازم مشکل هست یا نه؟ آیا این حداقل کدی هست که خطا رو تولید میکنه؟ یا میشه کمش کرد؟
سعی کردین موقع Freeze از Debugger برنامه رو Pause کنید و Call Stack رو مشاهده کنید؟

FastCode
چهارشنبه 09 اردیبهشت 1394, 19:36 عصر
void LoadToolStrips() {

ToolStripPanel topPanel = new ToolStripPanel { Dock = DockStyle.Top };

Controls.Add(topPanel);

ToolStrip ts = new ToolStrip { Dock = DockStyle.Fill, Name = "Primary" };

ToolStripComboBox tscomboMode = new ToolStripComboBox("tscomboMode");

ts.Items.Add(tscomboMode);

topPanel.Controls.Add(ts);



}




mono 4, mono 4.5, net 4, net 4.5 فقط در ویندوز freeze میشه. در لینوکس مشکلی نداره.
این هم freeze میشه.
فکر میکنم ممکنه بخاطر وضعیت پیچیده message loop و thread apartment ه برنامه باشه. واقعا نمیدونم.

plus
چهارشنبه 09 اردیبهشت 1394, 22:07 عصر
void LoadToolStrips() {

mono 4, mono 4.5, net 4, net 4.5 فقط در ویندوز freeze میشه. در لینوکس مشکلی نداره.
این هم freeze میشه.
فکر میکنم ممکنه بخاطر وضعیت پیچیده message loop و thread apartment ه برنامه باشه. واقعا نمیدونم.

وضعیت پیچیده Message Loop؟! اگه شما برای WinForms یک Message Loop مجزا نوشتی، میتونی روی همون BreakPoint بگذاری، فکر میکنم به نتیجه برسی، به هر حال یکجا اجرای این Loop متوقف میشه. اگه این طور نیست هم میتونید یک MessageFilter برای Application ثبت کنید و Message ها رو دنبال کنید شاید به نتیجه برسید.
به هر حال UI مربوط کنترل های مورد نظر توی این در یک Thread بیشتر اجرا نمیشه و چیزی هم که من میبینم و همونطور که میگین کد دیگه ای اجرا نمیشه. حتما بررسی کردین که LoadToolStrips در Thread صحیح اجرا میشه؟
در ضمن نگفتین با Pause کردن، اجرا کجا متوقف میشه.

FastCode
پنج شنبه 10 اردیبهشت 1394, 06:13 صبح
وضعیت پیچیده Message Loop؟! اگه شما برای WinForms یک Message Loop مجزا نوشتی، میتونی روی همون BreakPoint بگذاری، فکر میکنم به نتیجه برسی، به هر حال یکجا اجرای این Loop متوقف میشه. اگه این طور نیست هم میتونید یک MessageFilter برای Application ثبت کنید و Message ها رو دنبال کنید شاید به نتیجه برسید.
به هر حال UI مربوط کنترل های مورد نظر توی این در یک Thread بیشتر اجرا نمیشه و چیزی هم که من میبینم و همونطور که میگین کد دیگه ای اجرا نمیشه. حتما بررسی کردین که LoadToolStrips در Thread صحیح اجرا میشه؟
در ضمن نگفتین با Pause کردن، اجرا کجا متوقف میشه.

بله.ترد درسته.این تابع در constructor صدا زده میشه.
message filter رو آزمایش میکنم.
متشکرم.