VB6 - зависание в Inet - несколько экземпляров форм - PullRequest
0 голосов
/ 02 октября 2009

Вот мой статус приложения:

Цель - скачать несколько файлов списка из интернета. Подход - создал простую «форму загрузки». Через некоторое время мне просто потребовалось больше форм, потому что у меня было более одного списка файлов для загрузки. Просто решил, что, добавив MDIform в мой проект, добавьте кнопку для создания другого экземпляра «формы загрузки» и вуаля. Видимо, моя проблема была решена. Но нет: (

Когда я нажимаю кнопку «скачать» в форме-экземпляре 3, другие экземпляры формы (2 и 1) зависают при загрузке содержимого (иногда я получаю тайм-аут), пока форма-экземпляр 3 не завершит все загрузки и т. Д. , для всех других форм. Поэтому, хотя я знаю, что мое приложение не является многопоточным, несколько экземпляров одной и той же формы находятся в конфликте (предположительно, компонент Inet), и я не могу загрузить несколько файлов одновременно. Инет и моя функция загрузки определены в виде.

Что я могу сделать, чтобы решить эту проблему? как я могу скачать несколько файлов одновременно?

Большое спасибо

редактирование:

Я пытаюсь использовать предложение "wqw", но сталкиваюсь с некоторыми проблемами: В форме download_form у меня есть MSHFlexgrid с двумя столбцами: один с URL-адресом, а другой с адресатом файла. Я перебрасывал все строки, чтобы загрузить файлы и сохранить их. С подходом, предложенным "wqw", как я могу отличить каждую загрузку, чтобы сохранить ее с правильным именем, указанным в сетке?

Ответы [ 2 ]

3 голосов
/ 05 октября 2009

Что вы используете для фактической загрузки http? Я хотел бы попробовать Простые асинхронные загрузки и забыть о MDIForm Действительно!

2 голосов
/ 05 октября 2009

VB6, сам по себе, является однопоточным. Поэтому загрузка по разным формам вам не поможет.

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

Итак, как это работает, так:

  1. Вы вызываете метод Download для объекта ActiveX EXE
  2. В методе загрузки вы создаете экземпляр Timer и запускаете его практически сразу.
  3. Вы выходите из метода Download, тем самым возвращая управление объекту, который его вызвал.
  4. Затем вы возвращаетесь к основному приложению с помощью событий (например, DownloadProgress или DownloadComplete и т. Д.) *
...