икаєте метод проміжного об'єкта. Ваш поточний потік припиняється, запит методу переадресовується первісного потоку і викликається метод первісного об'єкта в тій же самому потоці, який створив об'єкт. Якби цикл був в об'єкті, то Ви б заморозили початковий потік.
Хорошим результатом застосування цього підходу є те, що все працює правильно. Об'єкт clsBackground може безпечно показувати форми і генерувати події. Недоліком цього підходу є, звичайно, його більш повільне виконання. Перемикання потоків і переадресація (marshalling) - відносно повільні операції. Ви фактично ніколи не захочете виконувати фонову операцію як показано тут.
Але цей підхід може надзвичайно добре працювати, якщо Ви можете поміщати фонову операцію безпосередньо у функцію BackgroundFuncApt! Наприклад: Ви могли б мати фоновий потік, що виконує фонові обчислення або операцію очікування системи. Коли вони будуть завершені, ви можете викликати метод об'єкта, який згенерує подія в клієнті. Зберігаючи кількість викликів методу, невелике щодо кількості роботи, що виконується в фонової функції, Ви можете досягати дуже ефективних результатів.
Що, якщо Ви хочете виконати фонову операцію, яка не повинна використовувати об'єкт? Очевидно, проблеми з угодою COM про потоки зникають. Але з'являються інші проблеми. Як фоновий потік повідомить про своє завершення пріоритетному потоку? Як вони обмінюються даними? Як два потоки будуть синхронізовані? Все це можливо виконати за допомогою відповідних викликів API. У моїй книзі Visual Basic 5.0 Programmer's Guide to the Win32 API є інформації щодо об'єктів синхронізації типу Подій, Mutexes, семафори і Waitable таймер.
Ця книга також включає приклади файлів відображаються в пам'ять, які можуть бути корисні при обміні даних між процесами. Ви зможете використовувати глобальні змінні, щоб обмінюватися дані, але треба знати, що таке поведінка не гарантується Visual Basic (іншими словами, навіть якщо це зараз працює, немає ніяких гарантій, що це буде працювати в майбутньому). У цьому випадку я міг би запропонувати Вам використовувати для обміну даними методики, засновані на API. Однак, перевагою показаного тут підходу, заснованого на об'єктах, є те, що цей підхід робить проблему обміну даними між потоками тривіальної, просто робіть це через об'єкт.
Висновок
Я одного разу почув від досвідченого програміста під Windows, що OLE є найважчою технологією, якою він коли-небудь навчався. Я з цим згоден. Це дуже велика тема, і деякі частини цієї технології дуже важко зрозуміти. Visual Basic, як завжди, приховує від Вас багато складнощів. p> Мається сильне спокуса, щоб користуватися перевагою просунутих методів типу багатопотокового режиму, використовуючи підхід "tips and techniques". Це спокуса заохочено деякими статтями, які іноді представляють специфічне рішення, запрошуючи Вас вирізати і вставити (cut and past) їх методики у ваші власні програ...