PDA

View Full Version : سوال: thread و سی پی یو های Dual core



HDDSoft2001
جمعه 04 اردیبهشت 1388, 04:52 صبح
با سلام خدمت دوستان

من در برنامه خود از thread استفاده کرده ام ولی در کامپوترهایی که دارای سی پی یوهای Dual core هستند خطا می دهد. من باید چکار کنم.



staticvoid Main()
{
Application.EnableVisualStyles();
Thread.CurrentThread.Name = "Mobile Byte Thread";

// --------------------- Run Program -----------------------
if (new frmSplash().ShowDialog() == DialogResult.OK)
{
Application.Run(new Forms.Main.frmMain());
}



-------------------------------------------------------------------------------------------------------

و در فرم frmSplash


-----------------------------------------------
privatevoid frmSplash_Shown(object sender, EventArgs e)
{
lblLoad.Text = "Initialized Createing Thread...";
Thread t = newThread(Start);
t.Name = "SplashMobileByteThread";
// this thread terminate, if MainThread terminated.

// Or procedure Start termainated.

t.IsBackground = true;
t.Start();
lblLoad.Text = "Created Thread...";
}

---------------------------------------------------
publicvoid Start()
{
-- my code

}

prankster
جمعه 04 اردیبهشت 1388, 09:58 صبح
این وظیفه .net framework و سیستم عامل است که thread های برنامه را به CPU منتقل کند و آنرا مدیریت کند!
کدی که ارسال کرده اید ناقص است، مشخص نیست که داخل thread دوم چه کاری انجام می شود.

فقط چند نکته:
- عموما در برنامه های windows form از thread به جز در موارد خیلی خاص استفاده نمی شود، به جای آن از BackgroundWorker می توان استفاده کرد که کامپوننتی است که thread های مجزا را برای windows form ها مدیریت می کند

- هنگامی که از thread در windows froms استفاده می شود باید دقت کرد که دسترسی به کنترل هایی که توسط Thread اصلی ایجاد شده اند فقط از داخل همان thread امکان پذیر است، خیلی از exception هایی که در استفاده از thread وجود دارد مربوط به همین نکته است. می توان کد زیر را درون constructor از فرم اصلی قرار داد و این مساله را تست کرد:


Control.CheckForIllegalCrossThreadCalls = false;

برای handle کردن این شرایط و توضیحات بیشتر می توانید اینجا را مطالعه کنید:
http://www.codeproject.com/KB/threads/threadpoolmanager.aspx

- دقت کنید application با thread اصلی شروع می شود که با STAThread با مشخص شده است، به صورت خلاصه این attribute کنترل کننده ارتباط بیت این Thread و Thread هایی است که از اجزای سیستم عامل استاده می کنند. هنگامی که با اجزای سیستم عامل و کامپوننت های COM کار می کنید، مثلا clipboard و یا File Dialog و نمی تواند این thread ها را کنترل کند باید آنرا به صورت MultiThread تعریف کنید:



static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);

Thread t = new Thread(new ThreadStart(StartNewStaThread));

t.SetApartmentState(ApartmentState.MTA);
t.Start();

}

private static void StartNewStaThread()
{
Application.Run(new Form1());
}

Zaparo
جمعه 04 اردیبهشت 1388, 10:03 صبح
شما اگر از سی پیو های چند هسته ای استفاده میکنید ، میتوندی از Parallel Fx استفاده کنید نسخه CTP ش قابل دانلود است البته مثل اینکه نسخه بتاش هم اومده، والا من که از کدی که شما نوشتید چیزی سر در نیوردم میشه درست بگین مشکل چی هست؟

HDDSoft2001
یک شنبه 06 اردیبهشت 1388, 12:48 عصر
با سلام خدمت دوستان :تشویق:

ببینید برنامه من یک فرم splash دارد که مواردی مثل چک کردن قفل برنامه و چک کردن ارتباط با دیتابیس و لود کردن کریسال ریپورت را برعهده دارد. در ضمن روی فرم splash من یک عکس قرار دارد. من برای اینکه درحین چک کردن ها در این فرم عکس پشت زمینه نیز update شود این عملیات چک کردن را در داخل یک thread جداگانه گذاشتم البته با همان قوانینی که اجزای دیگری توسط این ترد استفاده نشود.

اما مشکل برنامه من طبق تست های خود من دقیقا در هنگام شروع thread با متد start رخ می دهد ولی در سی پی یو های تک هسته ای هیچ مشکلی ندارد.

esmaeily-hosein
یک شنبه 06 اردیبهشت 1388, 14:05 عصر
داخل method مربوط به start رو بزار کدشو ببینم .

HDDSoft2001
یک شنبه 06 اردیبهشت 1388, 22:04 عصر
داخل method مربوط به start رو بزار کدشو ببینم .





delegate void DelSetText(string str);
delegate void DelCloseForm(DialogResult result);

--------------------------------------------------------------------------------

public void Start()
{
DelSetText SetTest = new DelSetText(s => lblLoad.Text = s);
DelCloseForm CloseForm = new DelCloseForm(
dr => { DialogResult = dr; this.Close(); });
Invoke(SetTest, "Start Thread...");
try
{
#region Cheek License
// ---------------Cheek Licen of Program-----------------
Invoke(SetTest, "Checking Lock Program ...");
Forms.Main.frmMain.DataProgram.TypeLicen = CheekLicen(false);
if ((Forms.Main.frmMain.DataProgram.TypeLicen !=
LicenseForm.Licens.TypeLicene.Register) &&
(Forms.Main.frmMain.DataProgram.TypeLicen !=
LicenseForm.Licens.TypeLicene.Trial))
{
Invoke(SetTest, "Access denie");
Invoke(CloseForm, DialogResult.Cancel);
return;
}
#endregion
#region Connect to Database
// ----------------Connecting to Database-----------------
Invoke(SetTest, "Connecting to Server ...");
int err = new BLL.ConfigureBLL().TestConnentToServer();
if (err == 4060) // Not Attached Or Not Premission
{
Invoke(SetTest, "Failed Connecting to Server");
Program.MsgDotConnectToServer();
// ----------------Attach Database------------------
using (SelectServer.frmAttachDB ADB =
new SelectServer.frmAttachDB())
{
if (ADB.ShowDialog() != DialogResult.OK)
{
Invoke(SetTest, "Failed Register Server");
Thread.Sleep(5000);
Invoke(CloseForm, DialogResult.Cancel);
return;
}
}
}
else if (err != -60000000)
{
Invoke(SetTest, lblLoad.Text = "Fail Connecting to Server");
Thread.Sleep(5000);
Invoke(CloseForm, DialogResult.Cancel);
return;
}
#endregion
#region Load Crystal Report
// -------------Load Crystall Report-----------------
Invoke(SetTest, "Loading CrystallReport ...");
CrystalDecisions.CrystalReports.Engine.ReportDocum ent d =
new Objects.Report.rptDocTaraz();
d.SetDataSource(new List<Objects.HesabTarazBO>());
d.Dispose();
#endregion
// -------------------------------------------
Invoke(SetTest, "All Loading Successfull");
Thread.Sleep(3000);
Invoke(CloseForm, DialogResult.OK);
return;
}
catch
{
Invoke(SetTest, "Don't all Loading Successfull");
Thread.Sleep(5000);
Invoke(CloseForm, DialogResult.Cancel);
}
}


البته باید بگم که کدهای این متد اصلا خطا نمی دهد.

SMRAH1
یک شنبه 06 اردیبهشت 1388, 23:47 عصر
سلام

1) باید دقیقا مشخص کنید که کجا مشکل وجود دارد!!!!
2) برای ساخت یک Splash پیشنهای می کنم این (http://barnamenevis.org/forum/showpost.php?p=610009&postcount=155)رو ببینید.

موفق باشید