четверг, 15 декабря 2011 г.

(1) Из потока в поток ...

Уважаемые коллеги !

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

Несмотря на то, что я не супер-пупер в программировании, меня задел тот факт, что практически никто (а я обошел почти весь Рунет, американские поисковики, а также провел выборочный поиск по немецким и французским сайтам) не смог решить задачу передачи данных из одного потока в другой (основной) с использованием BackGroundWorker.

Короче, постараюсь продемонстрировать суть проблемы на примере и в двух словах дать общее направление решения.

Где-то в начале весны пришла мне в голову мысль подправить собственную программу для домашнего использования под названием Electra (как в драме Еврипида). Вообще-то она предназначена для экономии электроэнергии. При этом мне потребовалось добавить отдельную форму для поиска файлов на диске. Сам код поиска я сунул в .dll-файл. Тут никаких видимых проблем не возникло. Поиск работал, как по маслу.

Но пока мой поисковик что-то искал, все остальное, естественно, резко зависало. После некоторых мытарств я решил попробовать контрол BackGroundWorker. В целом с ним тоже никаких проблем не возникло: всего-то несколько совершенно очевидных процедур.

От использования Progressbar (только в рамках процедур BackGroundWorker) пришлось отказаться, поскольку он считает от 1% до 100% (не буду останавливаться, поскольку спецы понимают, о чем речь). Progressbar, конечно, есть на форме, но он ничего не считает, а, собственно говоря, лишь показывает юзеру, что какойто процесс все-таки идет..

Итак, о главном. Задача стояла в том, чтобы найденные файлы последовательно (!!!) вставлялись в DataGridView. Но этого, конечно, не удалось. BackGroundWorker меня вежливо предупредил: "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'TextBox1' не из того потока, в котором он был создан". Ежу понятно, что при использовании BackGroundWorker доступ к контролам основного потока невозможен. Конечно, его легко можно организовать, используя обработчик события ProgressChanged (впрочем, как и переменные приложения, что нежелательно при допущении параллельного доступа к ним). Но это меня, как и многих других, мало заинтересовало, поскольку задачи стояли несколько иные.

Ну, конечно, я полазил в MSDN, походил по форумам. Пытался использовать таймеры, массивы и еще что-то. Но это все изврат. При этом реальной последовательной вставки найденных файлов в DataGridView мне достичь не удалось.

В конце-концов пришлось прибегнуть к старому испытанному методу - ВСПОМНИТЬ !!!  Ведь что-то похожее когда-то уже было. И не стоит изобретать велосипед.

Выпив чашечку кофе, покурив пару сигарет, я вспомнил. Лет 8-10 тому назад на одном из форумов одна девушка (она, кажется, ни одного форума не пропустила) что-то кому-то разъясняла. И она привела примерно следующую фразу: У каждого окна (Window) есть своя ручка (Handle).

Другими словами, задача в целом решена. Для этого тупо используем стандартную функцию SendMessage и элементарно кидаем найденные файлы в текстбоксы. Козе понятно, что без AddHandler не обойтись. Но это уже частности.

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

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

А пока - выкладываю скриншот.


среда, 14 декабря 2011 г.

(2) Поиск файлов с BackGroundWorker

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

http://www.lkviking.ru/bgworker/

Этот сайт-визитка недавно создан мной для моих друзей, поэтому лично гарантирую, что никакой заразы там нет.

При этом хотелось бы отметить, что собственно сама программа реализована в VS 2008 VB.NET. Я не думаю, что у тех, кто работает на С#, например, могут возникнуть проблемы. Сейчас конвертеров типа VB.NET-to-С# и С#-to-VB.NET в И-нете сколько душе угодно.

А если у кого возникнут какие-либо проблемы, пишите на мыло (lopasov56@mail.ru)  или сюда в комментарии - обязательно помогу, чем смогу.

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

На сегодня уже заканчиваю.

Всем привет и удачи !

понедельник, 12 декабря 2011 г.

(3) Примечание. BackGroundWorker

Друзья !

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

Единственная просьба. Если где-то (на действующих форумах и т.п.) увидете обсуждение указанной проблемы, не сочтите за труд дать им ссылку на мой сайт (http://www.lkviking.ru/bgworker/) или этот блог (http://alexx-prog.blogspot.com/), чтобы члены нашего программистского сообщества не мучились лишний раз.

В ближайших постах постараюсь кратко описать некоторые функции, которые использованы при реализации моей программы. Программистам они известны. Но все-таки... Старался на совесть.
На сегодня все.
Удачи !

воскресенье, 11 декабря 2011 г.

(4) Прототип BackGroundWorker

Коллеги!

В настоящее время доступен для скачивания сокращенный проект программы BackGroundWorker. Всего-то 10 процедур и ничего лишнего. Постарался тщательно откомментировать. Мне кажется, что проблем с пониманием быть не должно.
Можете считать его прототипом, хотя в действительности это не совсем так.
Естественно в ZIP-файл включен проект с .dll, в котором собственно реализован поиск.

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

Удачи !

суббота, 10 декабря 2011 г.

(5) Доступна полная версия программы

С сегодняшнего дня можно скачать не только сокращенную, но и полную версию проекта BackGroundWorker. Адрес, надеюсь, известен.

ZIP весит 5,43 МБ. Скачивайте и наслаждайтесь. Всему сообществу привет.

воскресенье, 4 декабря 2011 г.

(6) NB: BackGroundWorker

Уважаемое сообщество !

Во-первых. Выложенные вчера на моем сайте проекты 2-х программ с применением контрола BackGroundWorker ни в коем случае не претендуют на программистскую истину в последней инстанции. Если Вы обнаружите там какие-либо неточности, ошибки, сможете усовершенствовать код или предложить свои варианты решения проблемы, я буду очень Вам признателен.

Во-вторых. Этот блог не предусматривает изучение класса BackGroundWorker - этого добра в Сети и так предостаточно. Здесь рассматривается всего-лишь один из вариантов решения проблемы достаточно корректной передачи данных из асинхронного (фонового) потока еще до его завершения в основной поток.

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

В-четвертых. Коды программ-поисковиков в Сети в абсолютном большинстве своем просто бракованные. У меня сложилось совершенно устойчивое впечатление, что они работают только на отдельно взятых компьютерах. Например, вырвали код, интегрированный в программу, и даже не сомневаются, что он и у других заработает. Кроме того, я подозреваю, что в Штатах вообще какой-то особый Windows. Судя по всему, у них нет скрытых системных папок, о которые обычно спотыкаются поисковики (обычно - потому что поиск средствами FSO, насколько помню, ошибок не выдает, а такие папки спокойно обнаруживаются наравне с другими). В принципе, вполне достаточно в нужном месте отловить и проигнорировать исключение, например, следующим способом - и нет никаких проблем:

Try
'Your code
 Catch err As UnauthorizedAccessException

'If not access to directory then ignore error
End Try


В-пятых. Если сообществу все еще требуются собственно поисковики файлов и директорий, то я готов открыть здесь же новый блог. Естественно, исходники будут реально работающими.
К примеру, сейчас в моем распоряжении имеется проект поисковика (FileSystemEnumerator.zip) одного немца (Herfried K. Wagner). Выложу в новом блоге "как есть", за одним исключением. Там также при поиске выскакивает UnauthorizedAccesException, и я взял на себя смелость исправить это досадное недоразумение. При этом, для тех, кто не владеет немецким, сообщаю, что в Readme.txt он всего лишь говорит, что его программа предназначена для реализации рекурсивного поиска. В License.txt (на английском) он ставит жесткое условие о некоммерческом использовании его кода - как полностью, так и в любой части. Достоинством его является то, что во время поиска нет эффекта "зависания".
Короче, разбирайтесь сами. Сейчас мне не до этого. Надо сходить проголосовать, ведь сегодня - выборы. Если будет вечером времечко, то создам новый блог и выложу этот исходник. Кстати, он прилично откомментирован.

До встречи в эфире.

суббота, 3 декабря 2011 г.

(7) FileSystemEnumerator

Hi, People !

Только сегодня удалось разместить на сайте страничку, где по мере поступления буду размещать проверенные проекты поисковиков файлов и директорий.

Там можно скачать упоминавшийся в прошлом посте проект поисковика немца Herfried K. Wagner - FileSystemEnumerator.zip. Не забудьте на всякий случай ознакомиться с License.txt.


http://www.lkviking.ru/searcher/

Удачи !

суббота, 26 ноября 2011 г.

(8) Все о BackGroundWorker

 Hi Guys!

Вашему вниманию представляется мой новый блог, посвященный решению насущных задач, связанных с его применением.

Ознакомиться с ним можно тут.

Этот блог в целом предназначен не для скачивания готовых протестированных проектов, а для публикации незначительных по объему кодов, способных оказать помощь в решении тех или иных задач, возникающих перед любыми, даже самыми опытными программистами (к коим я себя не очень-то отношу) .

Удачи!