Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 11.04.2014, 03:23   #11
SPLER
Форумчанин
 
Регистрация: 15.02.2014
Сообщений: 53
Репутация: 10
По умолчанию

Сделал так:
Код:
private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
        {
            while (true)
            {
                using (Graphics g = Graphics.FromHwnd(mHandle))
                using (Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height, g))
                {
                    Graphics memoryGraphics = Graphics.FromImage(bmp);
                    IntPtr dc = memoryGraphics.GetHdc();
                    bool success = PrintWindow(mHandle, dc, 0x1);
                    memoryGraphics.ReleaseHdc(dc);                    
                }

                Thread.Sleep(TimeSpan.FromMilliseconds(10));
            }
        }
Нагрузка не изменилась, к сожалению.
SPLER вне форума   Ответить с цитированием
Старый 11.04.2014, 08:03   #12
WorldMaster
Профессионал
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Адрес: Россия, Мурманск
Сообщений: 2,267
Репутация: 683

icq: 359393755
По умолчанию

Цитата:
Сообщение от SPLER Посмотреть сообщение
Сделал так:

Нагрузка не изменилась, к сожалению.

Что такое mHandle?
и выложите весь код PrintWindow(mHandle, dc, 0x1);
__________________
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
Если помог - нажми на весы
WorldMaster вне форума   Ответить с цитированием
Старый 11.04.2014, 08:36   #13
SPLER
Форумчанин
 
Регистрация: 15.02.2014
Сообщений: 53
Репутация: 10
По умолчанию

Код:
public Form1()
        {
            InitializeComponent();
        }

        int ProcessID;
        IntPtr mHandle;

        private void button1_Click(object sender, EventArgs e)
        {
            getProcessIdHandle();
            backgroundWorker2.RunWorkerAsync();
        }

        private void getProcessIdHandle()
        {
            Process[] pL = Process.GetProcesses();
            foreach (Process mProc in pL)
            {
                if (mProc.ProcessName == "TestProcess")
                {
                    ProcessID = mProc.Id;
                    mHandle = mProc.MainWindowHandle;
                    break;
                }
            }
        }

        private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
        {
            while (true)
            {
                using (Graphics g = Graphics.FromHwnd(mHandle))
                using (Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height, g))
                {
                    Graphics memoryGraphics = Graphics.FromImage(bmp);
                    IntPtr dc = memoryGraphics.GetHdc();
                    PrintWindow(mHandle, dc, 0x1);
                    memoryGraphics.ReleaseHdc(dc);
                    pictureBox1.Image = bmp;                 
                }

                Thread.Sleep(TimeSpan.FromMilliseconds(10));
            }
        }
Вот, на всякий случай еще добавлю, у pictereBox1 параметры (Widht = 474, Height = 224), стоит анчор ко всем сторонам формы, я к тому что если форму растянуть, то ОЗУ улетает еще быстрее, в прочем эт понятно почему.
SPLER вне форума   Ответить с цитированием
Старый 11.04.2014, 09:02   #14
Luuzuk
Участник клуба
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Адрес: Самара
Сообщений: 975
Репутация: 605

icq: З7ЧЗЗ89Ч5
По умолчанию

Гарбадж коллектор из соображений производительности не освобождает оперативную память, пока не посчитает это нужным. Например, если на машине установлено достаточно много памяти, и свободной тоже полно. Так что ваши "скачки" загруженности ОЗУ - штатная работа сборщика мусора. Почитайте на досуге о принципах и механизмах его работы. Не нравится? Переходите на язык с ручным управлением памятью, там момент освобождения памяти контролировать сами будете.
__________________
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума   Ответить с цитированием
Старый 11.04.2014, 09:04   #15
WorldMaster
Профессионал
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Адрес: Россия, Мурманск
Сообщений: 2,267
Репутация: 683

icq: 359393755
По умолчанию

Цитата:
Сообщение от SPLER Посмотреть сообщение
Код:
public Form1()
        {
            InitializeComponent();
        }

        int ProcessID;
        IntPtr mHandle;

        private void button1_Click(object sender, EventArgs e)
        {
            getProcessIdHandle();
            backgroundWorker2.RunWorkerAsync();
        }

        private void getProcessIdHandle()
        {
            Process[] pL = Process.GetProcesses();
            foreach (Process mProc in pL)
            {
                if (mProc.ProcessName == "TestProcess")
                {
                    ProcessID = mProc.Id;
                    mHandle = mProc.MainWindowHandle;
                    break;
                }
            }
        }

        private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
        {
            while (true)
            {
                using (Graphics g = Graphics.FromHwnd(mHandle))
                using (Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height, g))
                {
                    Graphics memoryGraphics = Graphics.FromImage(bmp);
                    IntPtr dc = memoryGraphics.GetHdc();
                    PrintWindow(mHandle, dc, 0x1);
                    memoryGraphics.ReleaseHdc(dc);
                    pictureBox1.Image = bmp;                 
                }

                Thread.Sleep(TimeSpan.FromMilliseconds(10));
            }
        }
Вот, на всякий случай еще добавлю, у pictereBox1 параметры (Widht = 474, Height = 224), стоит анчор ко всем сторонам формы, я к тому что если форму растянуть, то ОЗУ улетает еще быстрее, в прочем эт понятно почему.
Где функция PrintWindow
__________________
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
Если помог - нажми на весы
WorldMaster вне форума   Ответить с цитированием
Старый 11.04.2014, 09:36   #16
WorldMaster
Профессионал
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Адрес: Россия, Мурманск
Сообщений: 2,267
Репутация: 683

icq: 359393755
По умолчанию

Как вы невнимательно читаете..
Все графиксы надо в юзинг оборачивать.
Код:
while (true)
            {
                using (Graphics g = Graphics.FromHwnd(mHandle))
                using (Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height, g))
                using(Graphics memoryGraphics = Graphics.FromImage(bmp))
                {                    
                    IntPtr dc = memoryGraphics.GetHdc();
                    PrintWindow(mHandle, dc, 0x1);
                    memoryGraphics.ReleaseHdc(dc);
                    pictureBox1.Image = bmp;
                }

                Thread.Sleep(TimeSpan.FromMilliseconds(10));
            }
__________________
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
Если помог - нажми на весы
WorldMaster вне форума   Ответить с цитированием
Старый 11.04.2014, 14:32   #17
SPLER
Форумчанин
 
Регистрация: 15.02.2014
Сообщений: 53
Репутация: 10
По умолчанию

Luuzuk, возможно Вы правы, но что касательно моей проблемы и вопроса, они решены, благодаря WorldMaster. Еще раз выражаю огромную признательность Вам. ОЗУ не то что бы в норме, а в идеале, программа изредка достигает 10-11 мб, после чего прыгает до 7 мб. Осталось только вопрос с отображением картинки в pictureBox1 разобраться, так как пока этого не происходит, к сожалению, но это другая история, буду тыкаться. Еще раз спасибо.
SPLER вне форума   Ответить с цитированием
Старый 11.04.2014, 14:43   #18
SPLER
Форумчанин
 
Регистрация: 15.02.2014
Сообщений: 53
Репутация: 10
По умолчанию

Вопрос с отображением решил, переместив Thread.Sleep в границы оператора using:
Код:
                {
                    IntPtr dc = memoryGraphics.GetHdc();
                    PrintWindow(mHandle, dc, 0x1);
                    memoryGraphics.ReleaseHdc(dc);
                    pictureBox1.Image = bmp;
                    Thread.Sleep(TimeSpan.FromMilliseconds(10));
                }
Правда иногда, после некоторого времени работы, что то происходит, после чего в pictureBox1 опять отображается перечеркнутый квадрат. Еще поковыряюсь.

Увеличил время задержки до 40 мс, минут 10 работает стабильно, больше не пробовал. За исключением некоторых моментов - если форму перетаскивать (быстро), происходит краш изображения, если медленно, то работает. Если форма не фиксированного размера, и pictureBox привязана к сторонам формы (т.е. если форму растянуть, то и размер pictureBox увеличится) при попытке увеличить форму, так же происходит краш изображения, если делать это медленно, то все работает. Если же форма фиксированного размера, и сделать двойной клик по ее заголовку (границам) то это тоже приведет к крашу изображения. Подозреваю что связанно это с задержкой в цыкле, или не правильным ее размещением.

Последний раз редактировалось SPLER; 11.04.2014 в 15:16. Причина: Дополнение
SPLER вне форума   Ответить с цитированием
Старый 11.04.2014, 15:11   #19
WorldMaster
Профессионал
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Адрес: Россия, Мурманск
Сообщений: 2,267
Репутация: 683

icq: 359393755
По умолчанию

Да покажите вы код PrintWindow сразу станет ясно что к чему.
__________________
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
Если помог - нажми на весы
WorldMaster вне форума   Ответить с цитированием
Старый 11.04.2014, 15:18   #20
SPLER
Форумчанин
 
Регистрация: 15.02.2014
Сообщений: 53
Репутация: 10
По умолчанию

WorldMaster, вот вообще весь код:
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Threading;
using System.Drawing.Imaging;

namespace PostThreadMsg
{
    public partial class Form1 : Form
    {
        [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags);

        public Form1()
        {
            InitializeComponent();
        }

        int ProcessID;
        IntPtr mHandle;

        private void button1_Click(object sender, EventArgs e)
        {
            getProcessIdHandle();
            backgroundWorker2.RunWorkerAsync();
        }

        private void getProcessIdHandle()
        {
            Process[] pL = Process.GetProcesses();
            foreach (Process mProc in pL)
            {
                if (mProc.ProcessName == "MyProcess")
                {
                    ProcessID = mProc.Id;
                    mHandle = mProc.MainWindowHandle;
                    break;
                }
            }
        }

        private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
        {
            while (true)
            {
                using (Graphics g = Graphics.FromHwnd(mHandle))
                using (Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height, g))
                using (Graphics memoryGraphics = Graphics.FromImage(bmp))
                {
                    IntPtr dc = memoryGraphics.GetHdc();
                    PrintWindow(mHandle, dc, 0x1);
                    memoryGraphics.ReleaseHdc(dc);
                    pictureBox1.Image = bmp;
                    Thread.Sleep(TimeSpan.FromMilliseconds(40));
                }
            }
        }
    }
}
SPLER вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скрин активного окна GrabbeR Общие вопросы Delphi 3 21.05.2012 15:28
определение активного окна DeDoK Общие вопросы Delphi 3 13.12.2010 20:07
Confirm при закрытии активного окна Jensi JavaScript, Ajax 4 17.08.2009 19:06
Поиск активного окна Arigato Win Api 5 22.11.2008 19:32


13:57.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.