PDA

View Full Version : مواجه با خطای : If you are using the Graphics object after the GetHdc method, call the ReleaseHdc



shahe_iran
پنج شنبه 20 مهر 1391, 21:45 عصر
با سلام

دوستان چرا این خطا رخ میده و راه برطرف کردنش چیه؟

من این کذ زیر رو به چند طریق مختلف مینویسم اما همین خطا تکرار میشه!

93850



private void Form1_Load(object sender, EventArgs e)
{
Thread t1 = new Thread(() =>
{
Capture c1 = new Capture();
var img=new Image<Bgr,byte>(640,480);
Image<Gray, Byte> gray;
Image<Gray, Byte> cannyEdges;

Gray cannyThreshold;
Gray cannyThresholdLinking;
Gray circleAccumulatorThreshold;
LineSegment2D[]lines;


double slope_l1, slope_l2;
double angle_l1, angle_l2;




while (true)
{
img = c1.QueryFrame();
pictureBox3.Image = img.Bitmap;
gray = img.Convert<Gray, Byte>().PyrDown().PyrUp();
cannyThreshold = new Gray(180);
cannyThresholdLinking = new Gray(120);
circleAccumulatorThreshold = new Gray(500); ;



cannyEdges = gray.Canny(cannyThreshold, cannyThresholdLinking);
lines = cannyEdges.HoughLinesBinary(
1,
Math.PI / 45.0,
20,
30,
10
)[0];
Image<Bgr, byte> ax = new Image<Bgr, byte>(640, 480);

foreach (LineSegment2D l1 in lines)
{
foreach (LineSegment2D l2 in lines)
{
if (Math.Abs(l1.P2.X - l1.P1.X) != 0 &&
Math.Abs(l2.P2.X - l2.P1.X) != 0)
{
slope_l1 = Math.Abs(l1.P2.Y - l1.P1.Y) / Math.Abs(l1.P2.X - l1.P1.X);
slope_l2 = Math.Abs(l2.P2.Y - l2.P1.Y) / Math.Abs(l2.P2.X - l2.P1.X);

angle_l1 = Math.Atan(slope_l1) * 180 / Math.PI;
angle_l2 = Math.Atan(slope_l2) * 180 / Math.PI;


if (

Math.Abs(angle_l2 - angle_l1) > 80 && Math.Abs(angle_l2 - angle_l1) < 100)

{
img.Draw(l1, new Bgr(Color.Green), 2);
img.Draw(l2, new Bgr(Color.Red), 2);

}

}
}
pictureBox2.Image = img.Bitmap;
pictureBox1.Image = img.Bitmap;
}
}
});t1.Start();
}


چند مدل دیگه هم کد رو میزنم اما بازم همین خطا رو میگیره

shahe_iran
پنج شنبه 20 مهر 1391, 21:47 عصر
مشکل داخل حلقه های foreach رخ میده ، اما نمیدونم چرا

لطفا راهنمایی کنید خیلی فوریه

morteza271
پنج شنبه 20 مهر 1391, 22:49 عصر
شاید اگه کدتون رو به صورت زیر تغییر بدین مشکلتون برطرف شه :

this.Invoke(new Action(delegate()
{
pictureBox2.Image = img.Bitmap;
pictureBox1.Image = img.Bitmap;
}));

البته میگم احتمال داره چون من نتونستم کدتون رو تست کنم نمیتونم نظر قطعی بدم!!!
موفق باشید

shahe_iran
پنج شنبه 20 مهر 1391, 23:45 عصر
بله دوست عزیز مشکل حل شد ، ولی ای کاش فلسفه این کار و اینکه مشکل چی بود و چطور حل شد رو هم بهم یاد بدید

دستور this رو هم همچتان واسم مبهمه ، چیزی که همه جا خوندم این بوده : یک شی از همین نوع! حالا کدوم نوع دقیقا نمیفهمم!!

morteza271
پنج شنبه 20 مهر 1391, 23:54 عصر
this شئ جاری رو برمیگردونه!
منظور از شئ جاری همون کلاسی هست که از this استفاده شده.
مثلا اگر در Form1 از this استفاده کنید این یک شئ از نوع Form1 خواهد بود و اگر در کلاس MyClass ازش استفاده کنید یک شئ از نوع کلاس MyClass خواهد بود.

اما در مورد مشکلی که با کد بالا برطرف شد :
در سی شارپ تمام کنترل ها بوسیله ترد اصلی برنامه کنترل و مدیریت می شوند و وقتی که شما یک ترد جدید ایجاد می کنید و میخواهید یکی از پراپرتی های این کنترل ها رو بوسیله ترد جدید تغییر بدی خطا میده که ترد دیگه ای در حال استفاده هستش و اجازه نمیده!
برای این باید از متد Invoke و Delegate استفاده شود.