Shadow TH Опубликовано 30 августа, 2009 Жалоба Поделиться Опубликовано 30 августа, 2009 (изменено) Пишу прогу. Она периодически работает с файлами (а именно, копирует их из одной директории в другую). Иногда размер файлов слишком большой и при использовании стандартной функции FileCopy в VB.NET при выполнении операции копирования форма приложения зависает до тех пор, пока копирование не будет завершено. Я где-то читал про использование так называемых потоков. Одним словом, как я понял, для копирования файлов можно выделить отдельный поток, в результате чего форма не будет зависать и во время копирования с программой можно будет параллельно дальше работать, а не ждать пока копирование будет завершено. Теперь вопрос: как работать с потоками в VB.NET? Изменено 30 августа, 2009 пользователем Shadow TH Ссылка на комментарий Поделиться на другие сайты Поделиться
Ф@РТОВЫЙ Опубликовано 31 августа, 2009 Жалоба Поделиться Опубликовано 31 августа, 2009 Система многопоточности в .net проста донельзя. Нам нужно создать метод, который будет выполнятся в отдельном потоке, метод должен быть без параметров и не должен возвращать результат. Пусть у нас это будет метод ThreadFileCopy внутри которого содержится обычный код. Теперь в нужном месте нужно создать поток и запустить его: Dim FileThread As New System.Threading.Thread(AddressOf ThreadFileCopy)FileThread.Start() Подробнее можно прочитать тут: http://msdn.microsoft.com/library/rus/defa...eethreading.asp Когда потоки используются очень часто для одних и тех же действий, имеет смысл вынести все конструкции потока в отдельный класс, в инициализации которого происходит создание и запуск потока, а так же который реализует нужные функции потока черз свои методы (например прирывание работы потока при отмене пользователем) Важно: по умолчанию все потоки кроме того что запущен из метода main() системой, при запуске приложения создаются вторичными, то есть когда завершится работа всех первичных потоков все вторичные потоки оборвутся и работа приложения будет завершена. Как сделать поток первичным читайте в документации. Ссылка на комментарий Поделиться на другие сайты Поделиться
Shadow TH Опубликовано 31 августа, 2009 Автор Жалоба Поделиться Опубликовано 31 августа, 2009 (изменено) С созданием и запуском потоков разобрался. Но всё же остались кое-какие вопросы. Вот допустим я объявил поток. Внутри поточного метода (ThreadFileCopy в нашем случае) могут располагаться различные операторы. Однако доступ к объектам из другого потока (скажем, надо изменить значение элемента ProgressBar) получить не удаётся: ввожу строку "ProgressBar1.Value = i" внутри метода ThreadFileCopy и во время работы программы как только компилятор доходит до этого оператора начинает ругаться - Cross-thread operation not valid: Control 'ProgressBar1' accessed from a thread other than the thread it was created on. В MSDN находил что-то про использование оператора Invoke, но так ничего и не понял. :) Объясните, pls. Изменено 31 августа, 2009 пользователем Shadow TH Ссылка на комментарий Поделиться на другие сайты Поделиться
Ф@РТОВЫЙ Опубликовано 31 августа, 2009 Жалоба Поделиться Опубликовано 31 августа, 2009 Насколько мне известно, переменные из другого потока доступны только для чтения, в этом и ошибка, когда вы пытаетесь записать данные другому потоку. Как вариант можно не писать данные из потока 2 в поток 1, а читать данные потоком 1 из потока 2 В C# еще можно напрямую обратится к памяти, но в VB.NET насколько мне известно такой возможности не продумано... С Invoke не работал... мало что могу сказать Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти