Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
898
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
951
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
941
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1725
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4398
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Windows формы потоков и событий - ListBox обновления быстро, но progressbar испытывает огромную задержку
Наша команда создает новую систему документооборота по подбору персонала взамен старой. Мне было поручено перенести старые данные в новую схему. Я решил сделать это, создав небольшой проект Windows Forms, поскольку схема радикально отличается, а прямые скрипты TSQL не являются адекватным решением.
Основной запечатанный класс 'ImportController', выполняющий эту работу, объявляет следующее событие делегата:
public delegate void ImportProgressEventHandler(object sender, ImportProgressEventArgs e);
public static event ImportProgressEventHandler importProgressEvent;
Главное окно запускает статический метод в этом классе, используя новый поток:
Thread dataProcessingThread = new Thread(new ParameterizedThreadStart(ImportController.ImportData));
dataProcessingThread.Name = "Data Importer: Data Processing Thread";
dataProcessingThread.Start(settings);
ImportProgressEvent args содержит строковое сообщение, максимальное значение int для индикатора выполнения и текущее значение progress int. В Windows форма зарегистрировавшегося на мероприятие:
ImportController.importProgressEvent += new ImportController.ImportProgressEventHandler(ImportController_importProgressEvent);
И реагирует на событие таким образом, используя свой собственный делегат:
private delegate void TaskCompletedUIDelegate(string completedTask, int currentProgress, int progressMax);
private void ImportController_importProgressEvent(object sender, ImportProgressEventArgs e)
{
this.Invoke(new TaskCompletedUIDelegate(this.DisplayCompletedTask), e.CompletedTask, e.CurrentProgress, e.ProgressMax);
}
Наконец, индикатор выполнения и listbox обновляются:
private void DisplayCompletedTask(string completedTask, int currentProgress, int progressMax)
{
string[] items = completedTask.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
foreach (string item in items)
{
this.lstTasks.Items.Add(item);
}
if (currentProgress >= 0 && progressMax > 0 && currentProgress <= progressMax)
{
this.ImportProgressBar.Maximum = progressMax;
this.ImportProgressBar.Value = currentProgress;
}
}
Дело в том, что ListBox, похоже, обновляется очень быстро ,но индикатор выполнения никогда не перемещается, пока пакет не будет почти завершен??? а что дает ?
Может быть, вы можете попробовать компонент BackgroundWorker. Это облегчает нарезание резьбы. Примеры здесь:
- BackgroundWorker потоки и поддержка отмены
- Использование компонента BackgroundWorker внутри .NET 2 приложения
- BackgroundWorker образец
@John
Спасибо за ссылки.
@Will
Там нет никакой выгоды от threadpooling, так как я знаю, что это когда-либо породит только одну нить. Использование потока исключительно для того, чтобы иметь отзывчивый UI, в то время как SQL сервер толчется с чтением и записью. Это, конечно, не короткоживущая нить.
Насчет кувалд ты прав. Но, как оказалось, моя проблема была все-таки между экраном и стулом. Мне кажется, что у меня есть необычный пакет данных, который имеет намного больше записей внешнего ключа, чем другие пакеты, и просто случайно выбирается в начале процесса, что означает, что currentProgress не получает ++'d в течение хороших 10 секунд.
@All
Спасибо за весь ваш вклад, это заставило меня задуматься, что заставило меня искать в другом месте кода, что привело к моему ahaa моменту смирения, когда я еще раз доказываю, что ошибка обычно человеческая :)
Вы уверены, что поток UI работает свободно во время всего этого процесса? то есть он не сидит заблокированным на соединении или каком-то другом ожидании? Вот как это выглядит для меня.
Предложение использовать BackgroundWorker является хорошим - определенно лучше, чем пытаться кувалдой выбить свой путь из проблемы с нагрузкой вызовов обновления / обновления.
И BackgroundWorker будет использовать поток пула, что является более дружелюбным способом поведения, чем создание собственного недолговечного потока.
Там нет никакой выгоды от threadpooling как
Я знаю, что он когда-нибудь породит только одного
нитка. Использование нити-это чисто
чтобы иметь отзывчивый UI в то время как SQL
Сервер толчется с чтениями и
пишет. Это уж точно не коротышка
жил нитью.
Там нет никакой выгоды от threadpooling как Я знаю, что он когда-нибудь породит только одного нитка. Использование нити-это чисто чтобы иметь отзывчивый UI в то время как SQL Сервер толчется с чтениями и пишет. Это уж точно не коротышка жил нитью.
OK, я ценю это, и рад, что вы нашли свой жучок, но вы смотрели на BackgroundWorker? Он делает в значительной степени именно то, что вы делаете, но в стандартизированной манере (т. е. без ваших собственных делегатов) и без необходимости создавать новый поток - оба из которых являются (возможно, небольшими, но, возможно, все же полезными) преимуществами.