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

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

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > WPF, UWP, WinRT, XAML
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2015, 14:35   #1
ninja2
Форумчанин
 
Регистрация: 13.08.2015
Сообщений: 193
По умолчанию Цикл обработки сообщений в 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, 14:43   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

В C# это делается относительно просто, особенно с async/await в .NET 4.5+. Ну или обычный Task из 4.0+. Более низкоуровневый вариант — Thread.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 29.09.2015, 14:46   #3
ninja2
Форумчанин
 
Регистрация: 13.08.2015
Сообщений: 193
По умолчанию

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

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

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

Последний раз редактировалось ninja2; 29.09.2015 в 14:50.
ninja2 вне форума Ответить с цитированием
Старый 29.09.2015, 14:53   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

Ну и вообще я ж писал в предыдущей теме http://programmersforum.ru/showpost....1&postcount=14, что WPF это не Дельфи/MFC/WinForms. На нем можно пытаться писать как перечисленном, но смысла мало, проще винформс тогда и взять. Надо почитать нормальную книжку по WPF сначала, разобраться с его основными фишками (+ общее из .NET типа потоков, синхронизации, структур данных).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

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

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

Вычитал что в WPF такой функции нету, что можно подключать функцию из windowsform, а как ее вызвать. Делаю так.
Код:
System.Windows.Forms.Application.DoEvents();
Пишет ошибку что пространство windows.Froms не определено, типо ссылки нету на зборку, а что это значит?
ninja2 вне форума Ответить с цитированием
Старый 29.09.2015, 15:21   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

А Silverlight это ж типа флеша, оно мало кому нужно.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 29.09.2015, 18:41   #7
ninja2
Форумчанин
 
Регистрация: 13.08.2015
Сообщений: 193
По умолчанию

Цитата:
В 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 в 18:49.
ninja2 вне форума Ответить с цитированием
Старый 29.09.2015, 19:11   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

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

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

Пример с просто выводом чисел как тут я вроде недавно писал в этой теме (еще и с async/await) http://programmersforum.ru/showthread.php?t=282538
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 29.09.2015, 19:19   #9
ninja2
Форумчанин
 
Регистрация: 13.08.2015
Сообщений: 193
По умолчанию

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

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

Про синхронизацию самый простой вариант это например Application.Current.Dispatcher.Invo ke или BeginInvoke. Более красивые варианты — IProgress<T> как по ссылке выше.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C# + WPF] Отлов нажатий клавиш, хуки, горячие клавиши в проекте WPF Casper-SC WPF, UWP, WinRT, XAML 3 03.03.2017 15: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 20:46