Member 12321673 Ответов: 5

Как может theads решить проблему медленного выполнения кода?. Большой код


Я написал программу с c#, используя backgroundworker для быстрого выполнения программы программа не реагирует и висит над компьютером, как я могу использовать потоки для быстрого выполнения большого кода, и это мои шаги программы:

fun_readImgs(); я хочу прочитать 100 изображений из папки.
зациклите все изображения и обработайте каждое из них.
fun_gray(count);преобразование изображения в серый уровень.
show_selection(image); показать текущее изображение в picturebox.
grid_add() показывает данные изображения в datagrid.

Что я уже пробовал:

when i use threads the problem the form processes stop and last the program show all at time ... please help

5 Ответов

Рейтинг:
1

raddevus

Попробуйте начать с кода, найденного в этом решении:
В C# Backgroundworker прогресс загрузки в ярлык, сделать байт на этикетке - переполнение стека[^]

Он покажет вам, как запустить счетчик на backgroundthreadworker, который обновит ваш пользовательский интерфейс. Это даст вам представление о потоке пользовательского интерфейса по сравнению с фоновыми потоками и обеспечит надежный старт, чтобы помочь вам в правильном направлении.


Рейтинг:
1

Dave Kreskowiak

Потоковая обработка не делает код "быстрее".

Потоковая обработка только помогает ускорить алгоритм, который поддается распараллеливанию. Это означает, что каждый поток получает единицу работы, которая не зависит от результата других единиц работы.

Проблема у вас есть в том, что вы "требуете" показа готовых изображений в том, что я предполагаю, один элемент управления PictureBox, как бы убивает всю идею распараллеливания этого процесса.

Кроме того, носитель данных не доступен нескольким потокам одновременно. Даже твердотельный накопитель имеет только один канал, по которому данные передаются на главную машину. Конечно, SSD действительно быстр, но он может обслуживать данные только для одного потока за раз.


Рейтинг:
0

RickZeeland

Если вы используете старомодный жесткий диск ваш код вероятно станет медленнее, для SSD-накопителей читайте ответы здесь: многопоточность - параллелизм ввода-вывода C# увеличивает производительность с SSD? - переполнение стека[^]

На сайте CodeProject вы можете найти интересную серию статей о Библиотека Параллельных Задач (ОСАГО): Библиотека параллельных задач: 1 н[^]


Рейтинг:
0

OriginalGriff

Мы не можем видеть код йору, поэтому мы понятия не имеем, что именно вы делаете.Скорее всего, из вашего описания следует, что вы запускаете несколько фоновых рабочих и заставляете их всех читать изображение и обрабатывать его.
That won't help, and may make the problem worse. Threading is not a "magic bullet" - it start a new thread which can operate at the same time as your UI thread provided there is a free core to run the new thread. If there isn't, the new thread gets "queued" until a core becomes available. If you create 100 threads, all of them doing a lot of long-time work, yoru system will run out of thread almost immediately, and will get "bogged down" trying to free up memory and access the same disk in each of the threads. once your cores all reach 100% utilization, you are pretty much dead in the water - the system can't magic up extra cores to run more threads, or open more bandwidth to your HDD.

А сама нарезка потоков добавляет накладные расходы, потому что на самом деле управление и переключение потоков занимает процессорное время - опять же на ядре!

Я бы посоветовал вам запустить в два раза меньше потоков, чем у вас есть ядер, и использовать Коллекции concurrentqueue[^] для хранения информации для каждого нового изображения, которое нуждается в обработке. Когда поток завершает изображение, он захватывает следующее из очереди и обрабатывает его. Когда она заканчивается, она закрывается.

Имейте в виду, что отчеты о ходе выполнения также должны быть краткими - если ваши фоновые потоки сообщают о большом прогрессе, это блокирует поток пользовательского интерфейса, а также пытается обрабатывать данные из всех потоков, подающих данные о ходе выполнения.


Рейтинг:
0

Member 12321673

Спасибо за все.
Я загружу вам свой программный код