У меня возникла небольшая проблема с простым приложением для копирования файлов, которое я пишу в Visual Basic 2005. У меня есть основной поток, который отслеживает графический интерфейс и сканирование файлов/копирования я создал отдельный поток, который я создаю так:Visual Basic, Child Thread Blocking Main Thread
trd_copy = New Thread(AddressOf CopyTask)
trd_copy.IsBackground = True
trd_copy.Start()
Это прекрасно работает на этапе сканирования операции, и я могу использовать кнопки в графическом интерфейсе просто отлично. Проблема заключается в том, что, когда CopyTask переходит на фазу копирования файлов (используя File.Copy), основной поток, как представляется, блокируется, и графический интерфейс с ним, что означает, что кнопка, которую я имею там для прерывания операции копирования, бесполезна. Когда копирование завершено, все возвращается в нормальное состояние, а во время копирования вспомогательный поток может обновить строку состояния в основной форме.
Уверен, что я пропустил что-то простое, но я не могу, чтобы жизнь меня видела, что это такое.
Большое спасибо!
Edit: Добавление кода для CopyTask():
Private Sub CopyTask()
Control.CheckForIllegalCrossThreadCalls = False
If check_scanfirst.Checked Then
status1.Text = "Scanning..."
bytestocopy = 0
scandir(src)
filesscanned = True
MsgBox("Scanning completed")
End If
If check_delete.Checked Then
' Do a clean of the destination, removing any files that don't exist in the source dir
End If
If filesscanned Then
ProgressBar1.Visible = True
ProgressBar1.Minimum = 0
ProgressBar1.Maximum = 100
ProgressBar1.Refresh()
End If
checkdir(src)
MsgBox("Copying completed")
If filesfailed > 0 Then
MsgBox("Warning: " + Str(filesfailed) + " files were not copied successfully.")
End If
guistop()
End Sub
Хм .. код для CopyTask? –
Вы случайно используете 'Invoke()' в 'CopyTask()'? Распространенная ошибка заключается в том, чтобы вызвать весь метод, таким образом, отрицая создание потока в первую очередь ... –
Извините, должен был добавить его - сейчас это главный вопрос. Не использовать Invoke вообще. Я относительно новичок в этом, исходя из кода прошивки/базового фона Blitz, поэтому я только изучаю ... Как я уже сказал, часть scandir() работает, как и ожидалось, реагирует и обновляется. checkdir() - это точно такой же код, только добавляет вызов File.Copy на каждую итерацию. – Daedalus