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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пауза в расчетах без паузы в отрисовке Gui 
:(
    Опции темы
dAlex
Дата 17.5.2011, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 3.8.2006
Где: Санкт-Петербург

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



Иногда в расчетах необходимо делать паузу (для того, чтобы успели примениться изменения) в одну-две секунды. 
Если делать 
Код

Thread.Sleep(1000);

окно при этом также подвисает. Как сделать отрисовку окна отдельно?
Функции, в которых делается пауза, вызываются так
Код

this.Dispatcher.BeginInvoke(new CheckNewStrikeDelegate(Core.CheckNewStrike), trade);

--------------------
eof()
PM WWW ICQ GTalk Jabber   Вверх
likegift
Дата 17.5.2011, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



а вы что считаете в main-thread?
PM MAIL   Вверх
SergeyLoginov
Дата 17.5.2011, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Не совсем уверен, что правильно понял, но, возможно, поможет вот это:
Код

Dispatcher.Invoke(DispatcherPriority.Loaded, new Action(() => { }));


Добавлено через 4 минуты и 10 секунд
А вообще для длительных вычислений вроде как используется BackgroundWorker там... А UI обновляется в Dispatcher.BeginInvoke(). 
Что-то мне подсказывает, что задача вовсе не требует пауз в одну-две секунды  smile 
PM MAIL   Вверх
dAlex
Дата 17.5.2011, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 3.8.2006
Где: Санкт-Петербург

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



likegift, 
SergeyLoginov, да там не совсем расчеты, там биржевая торговля и в определенных местах после отправки заявки на биржу надо чуть чуть подождать, потому что принимается не сразу. То есть тут не нагрузка на процессор, но пауза нужна =)

просто у меня UI обновляется сам, после изменения полей
--------------------
eof()
PM WWW ICQ GTalk Jabber   Вверх
likegift
Дата 17.5.2011, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А нельзя в таком случае делать асинхронную отправку данных с обработкой события по завершению?
PM MAIL   Вверх
-Mikle-
Дата 17.5.2011, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Вообще, любые реализации типа "чуть чуть подождать" разрушительны. Вы не можете гарантировать, что за 1-2 секунды произойдет сетевое(!!!) ожидаемое вами событие. Всегда надо использовать способ, как написал likegift. Реализация его тоже зависит от ваших бизнес-процессов.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
dAlex
Дата 18.5.2011, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 3.8.2006
Где: Санкт-Петербург

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



likegift, 
-Mikle-, это на будущее =) но даже если так, пока будем ждать события, gui также подвиснет. Тем более, тут такая кривая система, что у нее не узнать, сделано ли действие, потому что оно, по идее, должно делаться мгновенно.

Это сообщение отредактировал(а) dAlex - 18.5.2011, 09:56
--------------------
eof()
PM WWW ICQ GTalk Jabber   Вверх
-Mikle-
Дата 18.5.2011, 13:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Цитата(dAlex @  18.5.2011,  12:12 Найти цитируемый пост)
но даже если так, пока будем ждать события, gui также подвиснет

А это зависит от приложения уже. Как сделаешь, так и будет. События не обязаны исходить из основного потока. На данный момент, могу посоветовать только выполнять действия "операция1-подождать-операция2" в отдельном потоке (BackgroundWorker например) и синхронизировать их с основным (если нужно).


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
dAlex
Дата 19.5.2011, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 3.8.2006
Где: Санкт-Петербург

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



пытаюсь делать backgroundworker, но что-то запуталась

по msdn

Код

backgroundWorker = new System.ComponentModel.BackgroundWorker();
backgroundWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker_DoWork);


Код

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            // Do not access the form's BackgroundWorker reference directly.
            // Instead, use the reference provided by the sender parameter.
            BackgroundWorker bw = sender as BackgroundWorker;

            // Extract the argument.
            int arg = (int)e.Argument;

            // Start the time-consuming operation.
            e.Result = TimeConsumingOperation(bw, arg); //вместо нее мне надо вставить свою функцию, я так понимаю

            // If the operation was canceled by the user, 
            // set the DoWorkEventArgs.Cancel property to true.
            if (bw.CancellationPending)
            {
                e.Cancel = true;
            }
        }


но в том месте, где мне надо запустить backgroundWorker, мне мою функцию надо передать со своим параметром. Как это сделать?

--------------------
eof()
PM WWW ICQ GTalk Jabber   Вверх
likegift
Дата 19.5.2011, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

backgroundWorker.RunWorkerAsync(MySuperPuperParam)

PM MAIL   Вверх
dAlex
Дата 19.5.2011, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 3.8.2006
Где: Санкт-Петербург

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



а в TimeConsumingOperation обязательно добавлять параметры bw и arg? зачем они нужны?

upd: так, с arg ясно, это как раз наш SuperPuperParam

Это сообщение отредактировал(а) dAlex - 19.5.2011, 14:10
--------------------
eof()
PM WWW ICQ GTalk Jabber   Вверх
likegift
Дата 19.5.2011, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



а у вас аргумент какого типа?
PM MAIL   Вверх
dAlex
Дата 19.5.2011, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 3.8.2006
Где: Санкт-Петербург

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



likegift, тут свой тип Trade =)

сделала так

Код

backgroundWorker = new System.ComponentModel.BackgroundWorker();
backgroundWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker_DoWork);
backgroundWorker.RunWorkerAsync(trade);


Код

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{          
      Trade arg = (Trade)e.Argument;
      Core.CheckNewStrike(arg);
}


но такое ощущение, что  Core.CheckNewStrike вообще не выполняется
--------------------
eof()
PM WWW ICQ GTalk Jabber   Вверх
likegift
Дата 19.5.2011, 15:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



dAlex, 

TimeConsumingOperation - это просто метод из примера, без него можно жить, но с ним удобнее smile

Цитата

Core.CheckNewStrike вообще не выполняется 


а проверить то никак? на консоль там вывести или в лог..
PM MAIL   Вверх
-Mikle-
Дата 19.5.2011, 15:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



или брикпоинт поставить...


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




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


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

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