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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по Dispatcher, Только в WPF?? 
:(
    Опции темы
L0tR
Дата 23.12.2009, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 8.2.2009
Где: Москва (Любецы)

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



Лазил по MSDN в поисках решения одной задачки и пока понял, что мне нужно работать с Dispatcher.
Прогу пишу как Windows Forms App, но оказалось, что там нету поддержки Dispatcher и в целом пространства имён System.Windows.Threading.
Я добавил вручную библиотеку WindowsBase.dll, и возможность создавать объекты Dispatcher, собственно, появилась)) Но они должны использоваться, как свойства других объектов, например, контролов формы, а это, разумеется, возможным не стало. Неужели под Windows Forms нету поддержки Dispatcher??

Если и правда так, то сформулирую саму проблему.
Нужно реализовать перетаскивание рисунка мышью. То есть по событию MouseMove нужно вызывать метод, содержащий перерисовку. Но этот метод должен выполняться в отдельном потоке. То есть и ловить событие, и выполнять метод нужно в отдельном потоке. Я нашёл способ это делать только с помощью Dispatcher. Уверен, что такая простая вещь решается в Win Forms)) Подскажите, чем это реализовывать)
PM MAIL WWW ICQ   Вверх
tol05
Дата 23.12.2009, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 63
Всего: 170



винформс - это намесмейс System.Windows.Forms, а не System.Windows (System.Windows относится к WPF. И эта путаница - благодаря разработчикам WPF за недостаток воображения когда они свои намеспейсы придумывали)

Вам нужно в винформс работать через метод Invoke формы или отдельного контрола. 

метод Control.Invoke()
свойство Control.InvokeRequired
компонент System.ComponentModel.BackgroundWorker

Забудьте про Dispatcher вообще


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
L0tR
Дата 23.12.2009, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 8.2.2009
Где: Москва (Любецы)

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



Да, я и написал о том, что вроде как Dispatcher определён только в WPF...
Понятно, забыл про Dispatcher, ушёл читать про BackgroundWorker smile 
Спасибо)

Наверняка будут появляться ещё вопросы... буду тогда постить)
PM MAIL WWW ICQ   Вверх
L0tR
Дата 23.12.2009, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 8.2.2009
Где: Москва (Любецы)

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



Я нашёл способ обойтись простыми семафорами (ResetEvent) smile 
Теперь следующая проблема:
Рисунок может перемещаться мышью, но ещё надо ограничить частоту отрисовки, например, 60 Гц.
Я сделал отдельный поток, который каждую 1/60 секунды включает семафор:
Код

        public void Refreshing()
        {
            while (true)
            {
                nextframe.Set();
                Thread.Sleep(16); //16 мс = 1/60 сек
            }
        }


А поток, который делает отрисовку ждёт зелёного:
Код

            while (true)
            {
                mpos = PointToClient(MousePosition);
                (<рисунок>).Move(<параметры перемещения рисунка>);

                g.GBuffer.Render();

                WaitHandle.WaitAll(refevents); //Ждёт сигнала от nextframe и перемещения мышки
                nextframe.Reset();
            }


Для проверки добавил счётчик fps, и получается, как и надо, 60 (+-2 кадра). Монитор на моём ноуте - 60 Гц, то есть разницы, если убрать ограничение fps, не должно быть видно. Но если его нет, то рисунок перемещается практически синхронно с мышкой, а если есть, то появляются явные (хоть и не сильные) задержки, и иногда мелькание. fps при этом выдаёт около 110 (получается, фиксируется 110 движений мышкой в секунду).

Может дело в том, что не все из 60 кадров выводятся на монитор, так как частота обновления в проге ни с чем не синхронизирована) Что делать?)

UP
Попробовал запустить прогу под XP - проц грузит, как и в 7, на 2-15%, но fps показывает 50 smile  После того, как вместо 16 мс ожидания поставил 1, стало около 60, при этом визуально работает в общем-то также, как и в 7 ( а в ней тогда около 110 кадров). Не понимаю, что происходит в XP...
Чувтсвуется, тут нужно какое-то принципиально другое решение... подскажите плз) Не хочу заставлять комп делать лишнюю работу, учитывая, что графика потом будет сложней и, может, будет приводить к полной загрузке процессора.

Это сообщение отредактировал(а) L0tR - 24.12.2009, 01:59
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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