Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Невыполнение Idle при работе со списком. 
:(
    Опции темы
Mal Hack
Дата 4.1.2007, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: нет
Всего: 261



Код
// OnIdle EventHandler
        private void FncIdle(object sender, EventArgs e)
        {
            if (this.idle == false)
            { return; }

            if (cb.Text == "Не найдено сервисов." || cb.Text == "Выберите из списка.")
            {
                lblServiceNameInfo.Text = "";
                lblServicePathInfo.Text = "";
                lblServiceStatusInfo.Text = "";

                return;
            }

            LWS_UpdateInfo();
        }

// ComboBox
        private void cb_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cb.Text == "Не найдено сервисов." || cb.Text == "Выберите из списка.")
            {
                lblServiceNameInfo.Text = "";
                lblServicePathInfo.Text = "";
                lblServiceStatusInfo.Text = "";

                return;
            }

            LWS_UpdateInfo();
        }

При выборе элемента списка из комбобокса, вызывается  LWS_UpdateInfo();. Она же вызывается, в OnIdle.
Не знаю как, но когда я открываю список мышкой и не кликая перемещаю курсор с одного элемента списка на другой, срабатывает OnIdle.
Как этого избежать? Т.е. Idle должен работать всегда, кроме момента, когда я работаю со списком.
Как не пытался задействовать фокусы у списка и даже формы ничего не получается. Приложение либо снимается, либо работает так, как описано выше.
PM ICQ   Вверх
mr.DUDA
Дата 4.1.2007, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Mal Hack @  4.1.2007,  20:52 Найти цитируемый пост)
Как этого избежать? Т.е. Idle должен работать всегда, кроме момента, когда я работаю со списком.

Дело в том, что Idle вызывается каждый раз когда приложение простаивает (нет ничего в очереди сообщений). Поэтому, чтобы отделять ситуацию "приложение не выполняет действий" от ситуации "ждём реакции пользователя", нужно либо:

1) Не использовать Idle
2) В обработчике Idle проверять некий флаг, который ставить в true в каждом месте, где может возникнуть ожидание без действий со стороны пользователя (aka без добавления сообщений в очередь сообщений)


--------------------
user posted image
PM MAIL WWW   Вверх
Mal Hack
Дата 4.1.2007, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: нет
Всего: 261



2. Пытался такое сделать, но, в какой момент ставить флаг? На какиех двух событиях на комбобоксе это завязать?
Пробовал разное...
PM ICQ   Вверх
mr.DUDA
Дата 4.1.2007, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Событие DropDown - генерится при открытии раскрывающегося списка. Событие DropDownClosed - при закрытии.


--------------------
user posted image
PM MAIL WWW   Вверх
Mal Hack
Дата 4.1.2007, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: нет
Всего: 261



mr.DUDA, возможен еще и такой вариант, что список будет юзаться не раскрываясь через клаву или колесико мышки...
PM ICQ   Вверх
mr.DUDA
Дата 4.1.2007, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Mal Hack @  4.1.2007,  22:27 Найти цитируемый пост)
mr.DUDA, возможен еще и такой вариант, что список будет юзаться не раскрываясь через клаву или колесико мышки...

Тогда ловим SelectedIndexChanged/SelectedItemChanged, но имхо это не то. Ведь юзер может долгое время просто ничего не делать - как это обрабатывать ? Забивать на Idle с момента получения фокуса комбобоксом smile ?

Какую задачу вообще нужно решить ? Если необходимо выполнять действия в фоне, то вполне подойдёт отдельный поток (System.Threading.Thread).


--------------------
user posted image
PM MAIL WWW   Вверх
Mal Hack
Дата 4.1.2007, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: нет
Всего: 261



Цитата(mr.DUDA @  4.1.2007,  23:42 Найти цитируемый пост)
Какую задачу вообще нужно решить ?

Нужно проверять состояние одного сервиса, постоянно. И реагировать на это.

Цитата(mr.DUDA @  4.1.2007,  23:42 Найти цитируемый пост)
Забивать на Idle с момента получения фокуса комбобоксом smile ?

Пробовал. Не работает. Попозже попробую еще раз.
PM ICQ   Вверх
mr.DUDA
Дата 5.1.2007, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Mal Hack @  4.1.2007,  22:45 Найти цитируемый пост)
Нужно проверять состояние одного сервиса, постоянно. И реагировать на это.

Тогда отдельный поток - то что нужно.


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 5.1.2007, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(mr.DUDA @  5.1.2007,  08:51 Найти цитируемый пост)
Тогда отдельный поток - то что нужно.

Пример:
Код

public partial class Form1 : Form
    {
        private Thread _thread;

        public Form1()
        {
            InitializeComponent();
            StartListening();
        }


        private void StartListening()
        {
            if (_thread == null)
            {
                // Создаем новый поток и запускаем его
                _thread = new Thread(new ThreadStart(ListenServices));

                _thread.Start();
            }
            else
            {
                throw new Exception("Поток уже запущен");
            }
        }
        private void StopListerning()
        {
            if (_thread != null)
            {
                // Стопаем поток
                // Возбуждаем в методе потока ThreadAbortException
                _thread.Abort();
                // Ждем пока поток обработает исключение
                _thread.Join();

                _thread = null;
            }
            else
            {
                throw new Exception("Поток не запущен");
            }
        }

        private void ListenServices()
        {
            try
            {
                while (true)
                {
                    // будм считать, что LWS_UpdateInfo возвращает строку
                    // если она не пустая, то отображаем ее
                    string str = LWS_UpdateInfo();

                    if (str != "")
                    {
                        this.Invoke(new MethodInvoker(
                            // анонимный делегат, который поменяет значение Лабела
                            delegate()
                            {
                                this.label1.Text = str;
                            }
                        ));
                    }

                    Thread.Sleep(100); // останавливаем поток на 0.1 секунды :) 
                }
            }
            catch (ThreadAbortException)
            {/* просто возможность останова потока, возбуждением ThreadAbortException */}
        }

        private string LWS_UpdateInfo()
        {
            return DateTime.Now.ToString();
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            StopListerning();
        }



    }

PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 5.1.2007, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: нет
Всего: 261



А это не будет сильно грузить систему?
пошел покупать книжку Шилдта...
PM ICQ   Вверх
mr.DUDA
Дата 5.1.2007, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Mal Hack @  5.1.2007,  14:55 Найти цитируемый пост)
А это не будет сильно грузить систему?

Выставишь задержку в потоке, и будет занимать вообще 0%


--------------------
user posted image
PM MAIL WWW   Вверх
Mal Hack
Дата 5.1.2007, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: нет
Всего: 261



Окей. Спасибо... Пойду разбираться.
Ресурсы, которые кушает поток будут меньше, чем аналогичная реализация алгоритма через Timer?
PM ICQ   Вверх
mr.DUDA
Дата 5.1.2007, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Mal Hack @  5.1.2007,  18:58 Найти цитируемый пост)
Ресурсы, которые кушает поток будут меньше, чем аналогичная реализация алгоритма через Timer?

Ну, в общем да; смотря какой таймер, кстати. Есть System.Windows.Forms.Timer, который работает через обычную очередь сообщений винды и WM_TIMER -- такой таймер будет пропускать тики до тех пор, пока есть необработанные сообщения в очереди, закинутые раньше чем тик; а есть System.Threading.Timer - он посылает свои события через ThreadPool. Что кстати не всегда подойдёт, т.к. в случае если обработка события таймера занимает бОльшее время, чем период таймера -- тогда события таймера будут накапливаться в очереди на обработку, вплоть до разбухания очереди до бесконечности. Поэтому, советую юзать класс Thread, с пом. которого запускать свой метод в отдельном потоке, и делать в этом методе любые действия, разделяя их паузой этак в 10-100 миллисекунд.

З.Ы. кстати, если нужно работать с контролами на форме из отдельного потока -- то см. пример от ivashkanet, где стоит коммент " анонимный делегат, который поменяет значение Лабела"...


--------------------
user posted image
PM MAIL WWW   Вверх
Mal Hack
Дата 5.1.2007, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: нет
Всего: 261



Не совсем понятно назначение этого анонимного делегата...
Реализовал через потоки. Работает. Попозже код положу.
PM ICQ   Вверх
mr.DUDA
Дата 5.1.2007, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Mal Hack @  5.1.2007,  21:54 Найти цитируемый пост)
Не совсем понятно назначение этого анонимного делегата...

Ну, это для того чтобы можно было работать с виндошными контролами (окна, текстбоксы, листбокс, и т.п.) из не-GUI потоков. Обычно, если пытаешься например изменить текущий item в комбобоксе из другого потока --  генерируется exception.


--------------------
user posted image
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0915 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.