PDA

View Full Version : استفاده از متد در Thread به دفعات مختلف در سی شارپ



arastoahmadi
چهارشنبه 06 اسفند 1399, 23:46 عصر
سلام به اساتید گرامی

دوستام من تو سی شارپ یه متد ایجاد کردم که صفحه دسکتاپ رو به صورت استریم نمایش میده ، سوال من اینه که متد نمایش صفحه دسکتاپ شامل پارامتر quality می باشد که کیفیت تصویر رو مشخص میکنه حالا من میخام تصویر رو با چن کیفیت مختلف نمایش بدم ولی نمیخام ترد دیگه ای ایجاد کنم و میخام ترد به صورت پویا خودش ایجاد بشه و مطابق درخواست من تصویر رو با کیفیت درخواستی ارسال کنه و همچنین درصورتی که توقف رکورد رو زدم ترد استارت شده abort یشه . منطورم اینه که من یه متد با عنوان ScreenCapture(int quality) دارم که کارش عکس از صفحه دسکتاپ توسط while هستش، حالا میخام وقتی کاربر ضبط تصویر با کیفیت 25 رو زد یه ترد تحت عنوان همین موضوع ایجاد بشه و درواقع مقدار بازگشتی یعنی return image رو به تابعی که سمت سرور نوشتم Invoke کنه ، دیگه از سمت سرور من خودم تعیین کردم که مقدار رو برای کدام کلاینت بفرسته. من هدفم اینه که ما یه سیستمی داریم و درواثع این متد رو تو برنامه نوشتیم و میخایم هرکاربری که این تابع رو از سیستم با quality مورد نظر فراخوانی کرد تصویر براش ارسال بشه و ممکنه چند کاربر درخواست تصویر بکننن و منم به ذهنم رسید شاید بهتر باشه که از ترد دینامیکی استفاده کنم یعنی ترد به صورت اتوماتیک براساس هر درخواست ایجاد بشه ، ممنون میشم منو تو این زمینه راهنمایی بفرمایید و اگه راه حل بهتری برای جایگزینی ایده من هست ممنون میشم مطرح بفرمایید



private static ImageCodecInfo GetEncoder(ImageFormat format)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
foreach (ImageCodecInfo codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}
private void button2_Click(object sender, EventArgs e)
{
Thread t;
t = new Thread(() =>
{

while (true)
{
byte[] b = ScreenCapture(20);

this.BeginInvoke((MethodInvoker)delegate { pictureBox1.Image = Image.FromStream(new MemoryStream(b)); });

}
});
t.Start();

}
private byte[] ScreenCapture( int quality)
{
byte[] b = null;
Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
Graphics g = Graphics.FromImage(bitmap);
g.CopyFromScreen(0, 0, 0, 0, bitmap.Size);
ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
System.Drawing.Imaging.Encoder QualityEncoder = System.Drawing.Imaging.Encoder.Quality;
EncoderParameters myEncoderParameters = new EncoderParameters(1);
EncoderParameter myEncoderParameter = new EncoderParameter(QualityEncoder, quality);
MemoryStream memoryStream = new MemoryStream();
myEncoderParameters.Param[0] = myEncoderParameter;
bitmap.Save(memoryStream, jpgEncoder, myEncoderParameters);
String mem1 = Convert.ToBase64String(memoryStream.ToArray());
if (string.IsNullOrEmpty(mem2))
{
mem2 = Convert.ToBase64String(memoryStream.ToArray());
b = memoryStream.ToArray();
}
else
{
if (mem1.Equals(mem2))
{

//
}
else

{
var image = Image.FromStream(memoryStream);
b = memoryStream.ToArray();
mem2 = Convert.ToBase64String(memoryStream.ToArray());
}
}
Thread.Sleep(500);

return b;
}