PDA

View Full Version : مشکل در هنگ کردن دیتا گرید



marya0030
چهارشنبه 21 اسفند 1398, 18:19 عصر
سلام خدمت همه دوستان قدیمی برنامه نویس گلم

دوستان من یک برنامه نوشتم برای عکاسی

کارکرد برنامه به این صورت که اطلاعات و عکس هر مشتری ذخیره میشه بعد کاربر میتونه با فلش بالا و پایین در دیتاگرید حرکت کرده و اسم و عکس هر شخص ببینه (عکس برنامه گذاشتم )

مشکل بنده اینه که زمانی که کاربر بر روی دیتا گرید حرکت میکنه بعد مدتی دیتا گرید هنگ میکنه و عکس ها رو نشونش نمیده چند لحظه صبر میکنه دوباره خوب میشه یا باید کلا دیتا گرید ویو با دکمه ای که گذاشتم رفرش کن که مشکلش حل بشه

کد قسمت مورد نیاز



private void dataGridView1_KeyUp(object sender, KeyEventArgs e)
{


textBox5.Text = "";
this.pictureBox1.Image = null;
string tx6;
tx6 = textBox6.Text;

try
{
//---
this.pictureBox1.Image = null;
textBox5.Text = dataGridView1.CurrentRow.Cells[3].Value.ToString();
string tx5;
tx5 = textBox5.Text;
//---


textBox7.Text = string.Concat(tx6, tx5);
textBox7.Text = string.Concat(textBox7.Text, textBox13.Text);
pictureBox1.Image = Image.FromFile(textBox7.Text);

بچه ها کد بالایی یک ادرسی درست میکنه که عکس رو نشون بده من از تکست باکس استفاده کردم میتونستم از متغییرم استفاده کنم ولی نشد حالا:کف:

pictureBox2.Visible = false;



}


catch
{





this.pictureBox1.Image = null;
MessageBox.Show("عکس وجود ندارد");







}

marya0030
چهارشنبه 21 اسفند 1398, 18:27 عصر
البته دوستان بر روی سیستم خودم مشکلی نداره ولی بر روی سیستم عکاسی چون تعداد عکساش خیلی زیاده انگار هنک میکنه

the king
چهارشنبه 21 اسفند 1398, 21:09 عصر
با رخداد KeyUp نمی توانید انتخاب با ماوس رو پیگیری کنید، علاوه بر اینکه KeyUp ممکنه برای فشار کلیدی رخ بده بدون اینکه ناحیه انتخاب شده تغییری کرده باشه و بیخودی تصویر تکراری فراخوانی کنید.
لذا بهتره با رخداد SelectionChanged کار کنید که موقع تغییر Cell انتخاب شده رخ میده. از MessageBox استفاده نکنید، چون داریم برای فراخوانی تصویر از یک نخ مجزا (Multi Threading) استفاده می کنیم و نمایش پیام در رخداد ها وقفه ایجاد میکنه. دقت کنید که قبل از نمایش هر تصویر، تصویر قبلی رو Dispose می کنیم تا حافظه اش آزاد بشه.

private delegate void ShowPreviewDelegate(Image image, string path);

private Timer _timer;

private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
if (_timer == null)
{
_timer = new Timer() { Interval = 100 };
_timer.Tick += timer_Tick;
}
if (dataGridView1.CurrentRow == null)
{
pictureBox1.Tag = null;
}
else
{
string tx6;
tx6 = textBox6.Text;
textBox5.Text = dataGridView1.CurrentRow.Cells[3].Value.ToString();
string tx5;
tx5 = textBox5.Text;
textBox7.Text = string.Concat(tx6, tx5);
textBox7.Text = string.Concat(textBox7.Text, textBox13.Text);
pictureBox1.Tag = textBox7.Text;
}
_timer.Start();
}

private void timer_Tick(object sender, EventArgs e)
{
_timer.Stop();
var thread = new System.Threading.Thread(LoadPreview);
thread.Start(pictureBox1.Tag);
}

private void LoadPreview(object path)
{
Image image = null;
if (path != null)
{
try
{
image = Image.FromFile((string)path);
}
catch
{
}
}
Invoke(new ShowPreviewDelegate(ShowPreview), image, path);
}

private void ShowPreview(Image image, string path)
{
pictureBox1.Image?.Dispose();
pictureBox1.Image = image;
label1.Text = (image == null) ? "عکس وجود ندارد" : "";
}

marya0030
چهارشنبه 21 اسفند 1398, 22:04 عصر
واقعا ازت ممنونم جواب میده ولی سر کامپیوتر مقصد تست میکنم اگر اوکیییییییییی بود تشکرات ویژه ای باید از شما انجام بدم:گریه:

خیلی اذیت شدم سر این کد

ShayanFiroozi
جمعه 23 اسفند 1398, 00:21 صبح
با سلام و عرض ادب ،

من هم قبلا به اینجور مشکلات برخوردم ، البته کد دوستمون که با حالت چند نخی نوشتن صد در صد جواب میده ولی بنده احساس میکنم مشکل از جای دیگست !

در واقع اصلا در نرم افزار و کد شما نیست ، در حجم عکساییه که این روزا با دوربین های حرفه ای میگیرن و راحت سر از 10 یا 20 مگابایت در میارن ، خوب لود کردن همچین چیزی هم حافظه نرم افزار شما رو مصرف میکنه هم سرعتشو و بعد از چند ساعت کار کردن کند میکنه، حتی ویندوز ممکنه بعلت مصرف بیرویه سی پی یو و یا حافظه نرم افزار شما رو ببنده !

به نظر بنده شما قبل از نمایش و لود کردن عکس روی PictureBox حجم عکس مورد نمایشتون رو کم کنین ( فقط به شکل مجازی - فایل اصلی دستخوش تغییر نمیشه) :


private Image Image_Resize(Image image, int quality)
{
if (quality < 0 || quality > 100)
throw new ArgumentOutOfRangeException("quality must be between 0 and 100.");


// Encoder parameter for image quality
EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, quality);


// JPEG image codec
ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = qualityParam;


MemoryStream ms = new MemoryStream();




try
{
new Bitmap((Image) image.Clone()).Save(ms, jpegCodec, encoderParams);


return Image.FromStream(ms);
}
catch
{
return null;
}



}


private ImageCodecInfo GetEncoderInfo(string mimeType)
{
// Get image codecs for all image formats
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();


// Find the correct image codec
for (int i = 0; i < codecs.Length; i++)
if (codecs[i].MimeType == mimeType)
return codecs[i];


return null;
}


و حالا کد دوستمون به همراه تابع تغییر اندازه عکس :


private delegate void ShowPreviewDelegate(Image image, string path);

private Timer _timer;

private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
if (_timer == null)
{
_timer = new Timer() { Interval = 100 };
_timer.Tick += timer_Tick;
}
if (dataGridView1.CurrentRow == null)
{
pictureBox1.Tag = null;
}
else
{
string tx6;
tx6 = textBox6.Text;
textBox5.Text = dataGridView1.CurrentRow.Cells[3].Value.ToString();
string tx5;
tx5 = textBox5.Text;
textBox7.Text = string.Concat(tx6, tx5);
textBox7.Text = string.Concat(textBox7.Text, textBox13.Text);
pictureBox1.Tag = textBox7.Text;
}
_timer.Start();
}

private void timer_Tick(object sender, EventArgs e)
{
_timer.Stop();
var thread = new System.Threading.Thread(LoadPreview);
thread.Start(pictureBox1.Tag);
}

private void LoadPreview(object path)
{
Image image = null;
if (path != null)
{
try
{
image = Image_Resize(Image.FromFile((string)path),100);
}
catch
{
}
}
Invoke(new ShowPreviewDelegate(ShowPreview), image, path);
}

private void ShowPreview(Image image, string path)
{
pictureBox1.Image?.Dispose();
pictureBox1.Image = image;
label1.Text = (image == null) ? "عکس وجود ندارد" : "";
}