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

Вернуться   Форум программистов > .NET > WPF, UWP, WinRT, XAML
Регистрация

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

Ответ
 
Опции темы
Старый 29.09.2015, 15:35   #1
ninja2
Форумчанин
 
Регистрация: 13.08.2015
Сообщений: 193
Репутация: 18
По умолчанию Цикл обработки сообщений в WPF

Создал кнопку и поле редактирование на форме. к кнопке добавил обработчик в котором в цикле выводится в поле редактирование значения. Но у меня виснет программа, как добавить в цикл for цикл обработки сообщений windows???

Код:

private void button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("start");
            for(int i=0;i<1000;i++)
            {
                textBox.Text = Convert.ToString(i, 10);
            }
            MessageBox.Show("end");
        }

ninja2 вне форума   Ответить с цитированием
Старый 29.09.2015, 15:43   #2
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 17,141
Репутация: 3316

icq: 512-765
skype: alexp.frl
По умолчанию

Дык если надо чтоб не висло, то надо создать новый поток. (независимо WPF ли это или Дельфи)

В C# это делается относительно просто, особенно с async/await в .NET 4.5+. Ну или обычный Task из 4.0+. Более низкоуровневый вариант — Thread.
Alex11223 на форуме   Ответить с цитированием
Старый 29.09.2015, 15:46   #3
ninja2
Форумчанин
 
Регистрация: 13.08.2015
Сообщений: 193
Репутация: 18
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Дык если надо чтоб не висло, то надо создать новый поток. (независимо WPF ли это или Дельфи)

В C# это делается относительно просто, особенно с async/await в .NET 4.5+. Ну или обычный Task из 4.0+. Более низкоуровневый вариант — Thread.
А что там нету функций GetMessage или PeekMessage???
Должно в одном работать, нужно сообщения виндовс обрабатывать в цикле и все.

Поток создавать это один из вариантов, его позже попробую.

Последний раз редактировалось ninja2; 29.09.2015 в 15:50.
ninja2 вне форума   Ответить с цитированием
Старый 29.09.2015, 15:53   #4
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 17,141
Репутация: 3316

icq: 512-765
skype: alexp.frl
По умолчанию

Надо ж не только посмотреть, но и достать/обработать.
В Дельфи подобное делается функцией ProcessMessages, а в виформс DoEvents.
В WPF нет такой простой функции (и вряд ли это сделано непреднамеренно), но немного более сложно наверно можно это сделать.
https://www.google.com/search?q=wpf+doevents+equivalent
Но даже если есть, обычно их использование для решения подобной задачи — плохой вариант, в любом ЯП/библиотеке. Используйте потоки.

Ну и вообще я ж писал в предыдущей теме http://programmersforum.ru/showpost....1&postcount=14, что WPF это не Дельфи/MFC/WinForms. На нем можно пытаться писать как перечисленном, но смысла мало, проще винформс тогда и взять. Надо почитать нормальную книжку по WPF сначала, разобраться с его основными фишками (+ общее из .NET типа потоков, синхронизации, структур данных).

Последний раз редактировалось Alex11223; 29.09.2015 в 16:11.
Alex11223 на форуме   Ответить с цитированием
Старый 29.09.2015, 16:14   #5
ninja2
Форумчанин
 
Регистрация: 13.08.2015
Сообщений: 193
Репутация: 18
По умолчанию

Цитата:
Надо почитать нормальную книжку по WPF сначала, разобраться с его основными фишками (+ общее из .NET типа потоков, синхронизации, структур данных).
Потом, мне простые приложения научится делать без наворотов. Буду делать так как в WPF. Нихо старое учить, WPF чуть разберусь можно и Silverlite попробовать. Лучше новое пробовать.

Вычитал что в WPF такой функции нету, что можно подключать функцию из windowsform, а как ее вызвать. Делаю так.
Код:

System.Windows.Forms.Application.DoEvents();

Пишет ошибку что пространство windows.Froms не определено, типо ссылки нету на зборку, а что это значит?
ninja2 вне форума   Ответить с цитированием
Старый 29.09.2015, 16:21   #6
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 17,141
Репутация: 3316

icq: 512-765
skype: alexp.frl
По умолчанию

Надо библиотеку подключить (в References в Solution explorer'е), но вряд ли оно будет работать, читайте дальше.

А Silverlight это ж типа флеша, оно мало кому нужно.
Alex11223 на форуме   Ответить с цитированием
Старый 29.09.2015, 19:41   #7
ninja2
Форумчанин
 
Регистрация: 13.08.2015
Сообщений: 193
Репутация: 18
По умолчанию

Цитата:
В C# это делается относительно просто, особенно с async/await в .NET 4.5+. Ну или обычный Task из 4.0+. Более низкоуровневый вариант — Thread.
Я так понял ты имеешь введу Thread использовать. а как его использовать?

пот код кнопки по которому создается поток.
Код:

private void button_Click(object sender, RoutedEventArgs e)
        {
            System.Threading.Thread t = new System.Threading.Thread(f);
            t.Start();
            MessageBox.Show("end-button");
        }

        private void f()
        {
            //задержка
            MessageBox.Show("f-start");
            System.Threading.Thread.Sleep(TimeSpan.FromSeconds(10));
            MessageBox.Show("f-end");
        }

типо так делать?
Нада еще что то типо таймера создать.

Последний раз редактировалось ninja2; 29.09.2015 в 19:49.
ninja2 вне форума   Ответить с цитированием
Старый 29.09.2015, 20:11   #8
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 17,141
Репутация: 3316

icq: 512-765
skype: alexp.frl
По умолчанию

Ну погуглить/почитать и использовать.

Task удобнее/высокоуровневее, чем Thread.

К элементам UI нельзя напрямую без синхронизации обращаться из потока.

Пример с просто выводом чисел как тут я вроде недавно писал в этой теме (еще и с async/await) http://programmersforum.ru/showthread.php?t=282538
Alex11223 на форуме   Ответить с цитированием
Старый 29.09.2015, 20:19   #9
ninja2
Форумчанин
 
Регистрация: 13.08.2015
Сообщений: 193
Репутация: 18
По умолчанию

Цитата:
К элементам UI нельзя напрямую без синхронизации обращаться из потока.
что значит без синхронизации?
Я пробовал из потоковой функции обратится к taskBox.Text="что то" и вылазит ошибка. Это так нельзя обращаться из потока.
Нужно член класса создать и ему что то присваивать. Только нужно блокировку потока как то сделать. Щас попробую. С таймерами разобрался, там просто создаются.
ninja2 вне форума   Ответить с цитированием
Старый 29.09.2015, 20:32   #10
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 17,141
Репутация: 3316

icq: 512-765
skype: alexp.frl
По умолчанию

Ну нельзя "просто взять и" писать многопоточный код, надо теорию почитать. Независимо от языка.

Про синхронизацию самый простой вариант это например Application.Current.Dispatcher.Invo ke или BeginInvoke. Более красивые варианты — IProgress<T> как по ссылке выше.
Alex11223 на форуме   Ответить с цитированием
Ответ

Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C# + WPF] Отлов нажатий клавиш, хуки, горячие клавиши в проекте WPF Casper-SC WPF, UWP, WinRT, XAML 3 03.03.2017 16:00
Условие обработки сообщений. GPSS JavScr Помощь студентам 0 17.05.2014 23:59
QT - цикл обработки событий. Базиля Помощь студентам 6 25.10.2013 16:54
класс Screen в WPF. Есть ли такой? [?] Не добавлять же сборку Forms в WPF Casper-SC Общие вопросы .NET 2 30.07.2010 15:10
Функция обработки сообщений VVVadim Win Api 2 08.12.2008 21:46


18:40.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru