Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2010, 19:02   #11
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Цитата:
Сообщение от dampirik Посмотреть сообщение
Ну смотри на "делание" скриншотов... можно выделить поток но смысла...они будут вставать в очередь и все... и те через час работы у тебя комп помрет...... возможно стоит оптимизировать сриншоты... создать аналог своей функции...
Слушай, я опять не понял ни слова, ну кроме того, что в очередь вставать будут и то не уверен. Объясни нормально, если не затруднит. Я думаю надо выделять поток для метода делающего скриншот, но он с параметрами и у меня ничего не получается, я что-то не врубаюсь, как эти потоки вообще делать.

И можно поподробней, насчёт "через час работы у тебя комп помрет"

этот код выполняется, когда жму на горячую клавишу.
Код:
ScreenshotMaker sm = new ScreenshotMaker();
                    sm.CaptureScreen(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
                        "Screenshot_", ScreenshotFormat.JPEG);
Код:
        /// <summary>
        /// Сделать снимок экрана
        /// </summary>
        /// <param name="filePath">Полный путь к файлу</param>
        /// <param name="prefix">Префикс. Имя файла перед номером скриншота. Например "number_"</param>
        /// <param name="format">Формат изображения</param>
        public void CaptureScreen(String filePath, String prefixFileName, ScreenshotFormat format)
        {
         ..................................
         ..................................

             bmpScreenshot.Save(filePath + "\\" + prefixFileName + numberScreenshot + formatFile, imgFormat);
        }

Последний раз редактировалось Casper-SC; 05.04.2010 в 19:05.
Casper-SC вне форума Ответить с цитированием
Старый 05.04.2010, 19:36   #12
dampirik
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 722
По умолчанию

Когда мы выделяем создаем дополнительный потоки и не ставим ему приоритет то мы получаем ~50% от процессора если твоя функция не успевает на 100% сделать сриншот, то на 50 и подавно...Теперь смотрим дальше проходит еще одна секунда создаеться еще один поток уже на 33% (тк основной и до этого еще не выполнился...) и тд...ну я сильно не разбирался с функцией создания изображения... попробуй какнить его оптимизировать....создавать более маленького разрешение и тд..возможно попробовать организовывать это на уровне видиокарты(считает картинку она намного быстрее) через диретикс или еще ниже...
dampirik вне форума Ответить с цитированием
Старый 05.04.2010, 19:46   #13
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Да нееет. Функция штампует эти скриншоты хоть по 40 штук, тока ждать конечно 40 скриншотов придёться секунд 5 может, не знаю. А вот таймер проверяющий будильники так же эти 5 секунд стоит на месте и не проверяет, а когда продолжает проверять, то время в которое должен был сработать будильник уже прошло и он не срабатывает. Видимо без того, о чём я выше писал не обойтись. Мне надо сделать, чтобы таймер всегда работал, пусть, что угодно тормозит, но таймер срабатывает как положено. Или придётся делать, то что я писал выше.

Как бы вся беда в том, что я хочу создать максимально "безопасное" приложение. То есть, если даже у кого-то когда-то произойдёт непредвиденное мной, вот как эти 40 скриншотов, будильник всё равно сработает.

Последний раз редактировалось Casper-SC; 05.04.2010 в 19:48.
Casper-SC вне форума Ответить с цитированием
Старый 05.04.2010, 20:16   #14
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Опа! Я придумал самый простейший способ, с минимальными изменениями кода и как я думаю с 100% срабатыванием, даже после тормозов в несколько минут.

Добавляем в код:

Код:
        //таймер проверяет все включённые будильники в списке на срабатывание
        void timerCheckTime_Tick(object sender, EventArgs e)
        {
            savedTime = DateTime.Now;

            for (int i = 0; i < this.listViewAlarm.Items.Count; i++) //прогоняем на проверку весь список
            {
                ((AlarmClock)this.listViewAlarm.Items[i].Tag).SavedDateTime = savedTime;
                if (((AlarmClock)this.listViewAlarm.Items[i].Tag).EnabledAlarmClock) //если включён
                {
                    if (((AlarmClock)this.listViewAlarm.Items[i].Tag).CheckAlarmClock()) //проверяем будильник на срабатывание
                    {
                        this.listViewAlarm.Items[i].SubItems[1].Text = 
                            ((AlarmClock)this.listViewAlarm.Items[i].Tag).NextDate;
                        CreateAlarm(i);
                    }
                }
            }
            //Application.DoEvents();
        }
Так вот дальше в проверке каждого будильника использовать не текущее системное время, а время записанное в SavedDateTime
Я конечно ещё не пробовал, но думаю должно сработать.


======================


Блин, не прокатило. Всё равно та же беда. Я не учёл, что после тормозов присвоится текущая дата и это ничего не даст

Последний раз редактировалось Casper-SC; 05.04.2010 в 20:35.
Casper-SC вне форума Ответить с цитированием
Старый 05.04.2010, 22:59   #15
dampirik
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 722
По умолчанию

Ну положи таймер в отдельный поток с минимальным приорететом...
dampirik вне форума Ответить с цитированием
Старый 05.04.2010, 23:21   #16
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Как? Вот например хотябы такой код взять, на котором я пытаюсь научиться пользоваться всем этим делом. Там пишет, что нельзя обратиться к элементу формы созданному не в этом потоке, типа того, что-то.
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication8
{
    public partial class FormMain : Form
    {
       // Thread thr;
        BackgroundWorker bw = new BackgroundWorker();
        public FormMain()
        {
            InitializeComponent();
           // thr = new Thread(new ThreadStart(LaunchSelScreen));
            bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        }

        void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            LaunchSelScreen();
        }

        private void btnLaunchSelScreen_Click(object sender, EventArgs e)
        {

            bw.RunWorkerAsync();
           // thr.Start();
        }

        void ShowMessage()
        {
            MessageBox.Show("Привет!");
        }

        private void LaunchSelScreen()
        {
            this.Hide();
            Form1 frm = new Form1();
            this.WindowState = FormWindowState.Minimized;
            System.Threading.Thread.Sleep(250);
            frm.Owner = this;
            frm.Show();
        }

        private void btnCloseApplication_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
    }
}
А как таймер положить в отдельный поток я не в курсе и следует учесть, что этот таймер обращается к ListView на форме.
Casper-SC вне форума Ответить с цитированием
Старый 06.04.2010, 00:49   #17
dampirik
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 722
По умолчанию

Ну тот код который вы создаете зацикливается...создаете форму она инцилизирует поток в котором снова создаеться форма и тд...
Ну ... чтото голова уже не варит....
dampirik вне форума Ответить с цитированием
Старый 10.04.2010, 15:30   #18
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Всё нет уже сил Ну как вообще с этими потоками работать? Как сделать, чтобы при каждом нажатии делался скриншот в отдельном потоке или лучше в одном отдельном потоке? Что только не пробовал, пока остановился на таком варианте, но он не работате как я хочу:
Код:
static Thread thr = new Thread(CaptureScreenshot);
Код:
       private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if ((nCode >= 0) && (wParam == (IntPtr)WM_KEYDOWN))
            {
                int vkCode = Marshal.ReadInt32(lParam);
                if (((Keys)vkCode == Keys.LControlKey) || ((Keys)vkCode == Keys.Z))
                {
                    //thr.IsBackground = true;
                    if (thr.IsAlive)
                    {
                        thr.Abort();
                        thr.Start();
                    }
                    else
                    {
                        thr.Start();
                    }
                   
                    Application.DoEvents();
                    return (IntPtr)1;
                }
            }
            return CallNextHookEx(_hookID, nCode, wParam, lParam);
        }
Код:
        public static void CaptureScreenshot()
        {
            ScreenshotMaker sm = new ScreenshotMaker();
            sm.CaptureScreen(GlobalSettings.appSettings.DefaultFolderForScreenshots,
                        GlobalSettings.appSettings.Prefix, GlobalSettings.appSettings.ScreenImageFormat);
        }
Народ ну помогите кто нибудь, вообще не понимаю я эти потоки, а конкретно не понимаю как они работают, то есть методом тыка перебираю варианты и ничего не получается, может надо не так делать как я делаю? Может там вообще принцип работы другой?


Кстати работал другой вариант:
Код:
       private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if ((nCode >= 0) && (wParam == (IntPtr)WM_KEYDOWN))
            {
                int vkCode = Marshal.ReadInt32(lParam);
                if (((Keys)vkCode == Keys.LControlKey) || ((Keys)vkCode == Keys.Z))
                {

                   Thread thr = new Thread(new ThreadState(CaptureScreenshot));
                    thr.Start(); 
                    Application.DoEvents();
                    return (IntPtr)1;
                }
            }
            return CallNextHookEx(_hookID, nCode, wParam, lParam);
        }
Но процессор просто начинал загружаться на 100%, если нажать раз 5 подряд. Да и подозреваю после дня делания скриншотов потоков будет до неприличия много создано? Или я ошибаюсь?

Последний раз редактировалось Casper-SC; 10.04.2010 в 15:34.
Casper-SC вне форума Ответить с цитированием
Старый 14.04.2010, 10:27   #19
Arnezami
Форумчанин
 
Регистрация: 04.10.2009
Сообщений: 147
Восклицание

Цитата:
Сообщение от Casper-SC Посмотреть сообщение
Ну в общем я так и делаю.
Код:
        //таймер проверяет все включённые будильники в списке на срабатывание
        void timerCheckTime_Tick(object sender, EventArgs e)
        {
            for (int i = 0; i < this.listViewAlarm.Items.Count; i++) //прогоняем на проверку весь список
            {
                if (((AlarmClock)this.listViewAlarm.Items[i].Tag).EnabledAlarmClock) //если включён
                {
                    if (((AlarmClock)this.listViewAlarm.Items[i].Tag).CheckAlarmClock()) //проверяем будильник на срабатывание
                    {
                        this.listViewAlarm.Items[i].SubItems[1].Text = 
                            ((AlarmClock)this.listViewAlarm.Items[i].Tag).NextDate;
                        CreateMessageSignal(i);
                    }
                }
            }
            Application.DoEvents();
        }
Он работает каждую секунду. Я чуть-чуть перепутал, 12:00:00, делаю 5 скриншотов, а уже 12:00:01 и всё уже не сработал будильник, так как всё процессорное время скушали скриншоты и ровно в 12 таймер просто не успел проверить. Вот про что я.


А вот это, что - то не понятна мысль, про что речь конкретно?
Так а что Вам мешает запустить Ваши будильники через отдельный поток? И не нужно ничего мудрить! Они сработают в любом случае!
Ув. Форумчане! Если мои советы были Вам полезны, не забывайте благодарить в виде повышение рейтинга!!!
http://vkontakte.ru/id6715558
Arnezami вне форума Ответить с цитированием
Старый 14.04.2010, 10:44   #20
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Цитата:
А вот это, что - то не понятна мысль, про что речь конкретно?
Я опробовал, не работает щас уже не вспомню из-за чего, но это не обдуманная идея была.


Код:
if (((Keys)vkCode == GlobalSettings.appSettings.keyForScreenshot))
                {
                    bgrWorkerAlarm.RunWorkerAsync();
                    Application.DoEvents();
                    return (IntPtr)1;
                }
Код:
        /// <summary>
        /// Этот обработчик делает скриншот
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private static void bgrWorkerAlarm_DoWork(object sender, DoWorkEventArgs e) //Для создания скриншота
        {
            CaptureScreenshot();
        }
Код:
        /// <summary>
        /// Сделать скриншот экрана
        /// </summary>
        public static void CaptureScreenshot()
        {
            ScreenshotMaker sm = new ScreenshotMaker();
            sm.CaptureScreen(GlobalSettings.appSettings.DefaultFolderForScreenshots,
                        GlobalSettings.appSettings.Prefix, GlobalSettings.appSettings.ScreenImageFormat);
        }
У меня не получалось ничего из-за того, что метод который я хотел выполнить был не static.

Цитата:
Так а что Вам мешает запустить Ваши будильники через отдельный поток? И не нужно ничего мудрить! Они сработают в любом случае!
Вот именно, что не получается у меня. Может я не так понял. На главной форме таймер, который проверяет будильники. Так как из главного потока обращаться к отдельному? Да и ещё привязывать каждый будильник к свойству Tag ListView'a?

Последний раз редактировалось Casper-SC; 14.04.2010 в 10:51.
Casper-SC вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Горячие клавиши. Lazio Помощь студентам 2 08.09.2010 02:20
Как заблокировать горячие клавиши Alt+F11 kovalevskivf Microsoft Office Excel 2 20.05.2009 11:26
Как назначить "горячие" клавиши ekzobyte Общие вопросы Delphi 16 18.03.2009 21:15
Горячие клавиши Altera Общие вопросы Delphi 5 13.09.2008 21:27