PDA

View Full Version : هنگ کردن فرم برنامه



Direlap
یک شنبه 16 مهر 1391, 18:11 عصر
سلام دوستان عزیز
تو برنامم با استفاده از یه نخ دیگه ( به جز نخ اصلی برنامه ) دارم یک فرمی از فرم های برنامم رو فعال می کنم.
مشکل اینجاست که وقتی میخوام اونو فعالش کنم موقع show کردنش اون فرم ( یه فرم خیلی ساده ) هنگ می کنه .
البته خود فرم اصلی برنامم سرجاش ثابته و فقط با بستن این فرمه که هردوتاش بسته میشن.
حالا مشکل کار من کجاست ؟

CommunicationForm cmm = new CommunicationForm();
cmm.Show();
cmm.SetText(a[2]);
cmm.TextAssign(a[1]);

Farshid007
یک شنبه 16 مهر 1391, 20:06 عصر
زمانی با بستن یک فرم کل برنامه خارج میشه که فرم اصلی (فرم که تو Program.cs تعریف شده )بسته بشه!
تو فرم 2 چه کاری انجام میده که منجر به هنگ کردن برنامه میشه؟

morteza271
یک شنبه 16 مهر 1391, 20:09 عصر
احتمالا به خاطر اینه که شما در نخ دوم از تابع Invoke استفاده نمی کنید.
متن خطا و کدتون رو بذارین تا دوستان بتونن کمکتون کنن.

Direlap
یک شنبه 16 مهر 1391, 20:21 عصر
زمانی با بستن یک فرم کل برنامه خارج میشه که فرم اصلی (فرم که تو Program.cs تعریف شده )بسته بشه!
تو فرم 2 چه کاری انجام میده که منجر به هنگ کردن برنامه میشه؟

من با یه نخ دیگه میخوام یه فرم رو اجرا کنم . کدشم گذاشتم . موقع اجرا شدن هنگ می کنه !!!! بدون هیچ خطایی.

Direlap
یک شنبه 16 مهر 1391, 20:22 عصر
احتمالا به خاطر اینه که شما در نخ دوم از تابع Invoke استفاده نمی کنید.
متن خطا و کدتون رو بذارین تا دوستان بتونن کمکتون کنن.

هیچ خطایی نمیده و من از Invoke استفاده نمی کنم. یعنی اطلاعی ازش ندارم تا بتونم ازش استفاده کنم.

morteza271
یک شنبه 16 مهر 1391, 20:43 عصر
اگه امکانش هست پروژتون رو بذارین اینجا.
به نظرم باید مشکل از همونی هست که گفتم ولی نمیتونم به طور دقیق بگم.
اگه پروژتون باشه و یا اینکه کدهای مربوطه رو بذارین شاید بتونم کمکتون کنم.

مسعود اقدسی فام
یک شنبه 16 مهر 1391, 20:49 عصر
این کدهایی که نوشتید داخل ترد اجرا می‌شه دیگه؟ اونطوری باشه چون اشیاء فرم داخل نخ ساخته شدن بعیده خطای Invoke رو بده. احتمالا مشکل از اینه که روی Parentی Show شده که از یه نخ دیگه هستش. البته شاید. فقط حدس زدم.

Direlap
یک شنبه 16 مهر 1391, 21:57 عصر
اونطوری که تا حالا تو سایت های انجمن اصلی دیدم اینه که نباید تو نخ دیگه ای جز نخ اصلی برنامه فرمی باز بشه.
اینم از کد برنامه . البته کد نخ مورد استفاده

Thread newThread = new Thread(Receive);
newThread.Start();
void receive()
{
FormCollection fc = Application.OpenForms;
bool found = false;
foreach (Form f in fc)
{
if (f.Text == "Communicate with : " + a[1])
{
CommunicationForm cmm = new CommunicationForm();
cmm.Show();
cmm.SetText(a[2]);
cmm.TextAssign(a[1]);
}
}
}

اینطوری که دیدم انگار راه حلش اینه که اطلاعات رو بدی به نخ اصلی برنامه تا اون فرمو باز کنه . البته چطوری ؟
یا یه event به فرم اصلی اضافه کنم تا اطلاعات رو به اون بدم تا فرم رو باز کنی . این راهشم بلد نیستم.
ممنونم از همتون

hakim22
یک شنبه 16 مهر 1391, 22:16 عصر
دقت کنید که خیلی از اشیا ThreadSafe نیستند و به دلایلی که مربوط به تخصیص حافظه میشه از کنترلها به طور مستقیم درون Thread نمیشه و نباید استفاده کرد.
معمولا با Delegate مشکل حل میشه .

Direlap
یک شنبه 16 مهر 1391, 22:45 عصر
چطوری میتونم از delegate تو این برنامم استفاده کنم ؟

morteza271
یک شنبه 16 مهر 1391, 23:22 عصر
کد داخل تابع رو به این صورت تغییر بدین ببینید درست میشه یا نه:
void Receive()
{
this.Invoke(new Action(delegate()
{
FormCollection fc = Application.OpenForms;
bool found = false;
foreach (Form f in fc)
{
if (f.Text == "Communicate with : " + a[1])
{
CommunicationForm cmm = new CommunicationForm();
cmm.Show();
cmm.SetText(a[2]);
cmm.TextAssign(a[1]);
}
}
}));
}

موفق باشید

Direlap
یک شنبه 16 مهر 1391, 23:38 عصر
قربانت عزیز. کار کرد. پروژم لنگ این تیکه بود.
یه هفته ای بود که باهاش کار می کردم و جواب نمیداد.
حالا یه توضیحی میدین در رابطه با این ؟

morteza271
دوشنبه 17 مهر 1391, 09:02 صبح
من که همون اول گفتم به خاطره اینه که از Invoke استفاده نمی کنید!

حتما می دونید که وقتی از چند ترد در برنامه استفاده بشه و وقتی که یکی از کنترل ها بوسیله یکی از تردها در حال استفاده باشه تردهای دیگه نمیتونن به اون کنترل دسترسی داشته باشن.
به همین خاطر باید از این متد استفاده باشه تا یه این دسترسی رو مجاز کنه.
برای اطلاعات بیشتر می تونید به آدرس زیر مراجعه کنید :
http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx
موفق باشید