Dave in NC Ответов: 1

Как мне обойти "не отвечать"?


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

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

Я искал примеры по нарезанию резьбы. Единственное, что я смог найти, что понятно, - это то, где установлены две нити. Один генерирует буквы, а другой-числа. Я вижу, как буквы и цифры на экране переплетаются.

Это прекрасно и денди, но это не объясняет, как решить мою проблему. Я не генерирую числа и буквы.

Кстати, я пишу это на C#.

Любая помощь будет оценена по достоинству!

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

Исследования, исследования, исследования, исследования

MadMyche

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

1 Ответов

Рейтинг:
4

OriginalGriff

Самое простое решение, вероятно, состоит в том, чтобы использовать Класс BackgroundWorker (System.ComponentModel) | Microsoft Docs[^] - он позволяет переместить длинный запущенный код в обработчик DoWork и сообщить о прогрессе обратно в основной поток через событие ProgressChanged. Ссылка включает в себя пример, который сообщает процент, но вы можете использовать BackgroundWorker.Метод ReportProgress (System.ComponentModel) | Microsoft Docs[^] который принимает два параметра для передачи вашей строки имени файла в событие e.UserState собственность. Приведите это к вашей строке и обновите свой дисплей.

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


Dave in NC

Я ценю ваш ответ, но до сих пор мне это не удавалось. Возможно, это что-то очень незначительное.
Me.BGW1.RunWorkerAsync() не запускается
Private Sub BGW1_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) HandlesBGW1.Метода dowork.

Есть идеи, в чем может быть проблема?

OriginalGriff

Без соответствующих фрагментов кода?
Вообще никаких ...

Dave in NC

Частные Субдотекопии()
Скопированные файлы.Четкий()
BtnStart.Enabled = False : BtnStart.BackColor = Color.Red
Me.BGW1.RunWorkerAsync()
BtnStart.Включен = Истина : BtnStart.Цвет Фона = Системных Цветов.ButtonFace
Конец Подводной Лодки

Private Sub BGW1_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) обрабатывает BGW1.Метода dowork
Dim Worker As BackgroundWorker = DirectCast(отправитель, BackgroundWorker)
Dim Path1, Path2, strMsg как строка
Dim intLoopCtr = WorkRecList.Рассчитывать

- Сначала установите индикатор выполнения
For I As Integer = 1 To intLoopCtr
'Поднять прогресс изменил события в UI-потоке
Работник.ReportProgress(I, I & " обработанные записи")

-Именно здесь делается трудоемкая работа.
Для каждой записи в WorkRecList
Путь1 = Путь.Комбайн(вход.FPath, entry.FN)
Путь2 = Путь.Объединить(txtStartDir.Text, entry.FN)
Если Рабочий.Тогда Отмена Платежа
е.Отмена = Истина
Выход Для
Конец, Если
Если Файл.Существует(Путь 2), То
intFilesSkipped += 1
файл журнала.Add(Path2 & " существует в выходных данных. Файл пропущен.")
Еще
'Мыши frmmain.lblStatus.Текст = "копирование" &амп; запись.ФН : мыши frmmain.lblStatus.Освежить()
Попробуй
FileCopy(Path1, Path2)
Catch copyError As IOException
strMsg = copyError.Сообщение
файл журнала.Добавить(strMsg)
intFilesSkipped += 1
Окончательно
strMsg = "файл" & запись.FN & " скопировано. "
Скопированные файлы.Добавить(Путь 1)
файл журнала.Добавить(strMsg)
intFilesCopied += 1
Конец Попытки
Конец, Если
Следующий
Следующий
Конец Подводной Лодки

'* Этот метод выполняется в потоке пользовательского интерфейса
Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object,
Бывал е как система.ComponentModel.ProgressChangedEventArgs) _
Ручки BGW1.событие ProgressChanged
'Me.ProgressBar1.Value = e.ProgressPercentage
Конец Подводной Лодки