Shadow TH Posted August 30, 2009 Report Share Posted August 30, 2009 (edited) Пишу прогу. Она периодически работает с файлами (а именно, копирует их из одной директории в другую). Иногда размер файлов слишком большой и при использовании стандартной функции FileCopy в VB.NET при выполнении операции копирования форма приложения зависает до тех пор, пока копирование не будет завершено. Я где-то читал про использование так называемых потоков. Одним словом, как я понял, для копирования файлов можно выделить отдельный поток, в результате чего форма не будет зависать и во время копирования с программой можно будет параллельно дальше работать, а не ждать пока копирование будет завершено. Теперь вопрос: как работать с потоками в VB.NET? Edited August 30, 2009 by Shadow TH Link to comment Share on other sites More sharing options...
Ф@РТОВЫЙ Posted August 31, 2009 Report Share Posted August 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() системой, при запуске приложения создаются вторичными, то есть когда завершится работа всех первичных потоков все вторичные потоки оборвутся и работа приложения будет завершена. Как сделать поток первичным читайте в документации. Link to comment Share on other sites More sharing options...
Shadow TH Posted August 31, 2009 Author Report Share Posted August 31, 2009 (edited) С созданием и запуском потоков разобрался. Но всё же остались кое-какие вопросы. Вот допустим я объявил поток. Внутри поточного метода (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. Edited August 31, 2009 by Shadow TH Link to comment Share on other sites More sharing options...
Ф@РТОВЫЙ Posted August 31, 2009 Report Share Posted August 31, 2009 Насколько мне известно, переменные из другого потока доступны только для чтения, в этом и ошибка, когда вы пытаетесь записать данные другому потоку. Как вариант можно не писать данные из потока 2 в поток 1, а читать данные потоком 1 из потока 2 В C# еще можно напрямую обратится к памяти, но в VB.NET насколько мне известно такой возможности не продумано... С Invoke не работал... мало что могу сказать Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now