powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / URLDownloadToFile в отдельном потоке
19 сообщений из 19, страница 1 из 1
URLDownloadToFile в отдельном потоке
    #36598680
Guest v.22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
RetVal = URLDownloadToFile( 0 , MyHTTP, MyFILE,  0 ,  0 )
Запихнул URLDownloadToFile в отдельный поток, чтобы не вставал основной поток программы, т.к. функция не асинхронная.
С потоками более-менее дружу для простейших случаев. Суть не в этом.
При вызове URLDownloadToFile из отдельного потока почему-то подгружаются не все страницы... Некоторые подгрузиться не могут, и RetVal возвращает -2147221020 (&h800401E4).
Что это за возвращаемый код, нигде не нашел.
Если вызвать из основного потока - все грузится без ошибок.
Куда копать?
... Не грузятся одни и те же страницы (примерно четверть от общего числа), ошибка строго повторяется.
...
Рейтинг: 0 / 0
URLDownloadToFile в отдельном потоке
    #36598701
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Guest v.22

Покажи как потоки запускаешь, как проверку делаешь, как синхронизируешся

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
URLDownloadToFile в отдельном потоке
    #36598747
Guest v.22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хм. Всё как обычно.
Я думаю, проблема не в этом.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
' форма
ThTHREAD = CreateThread(ByVal  0 &, ByVal  0 &, AddressOf LOADHTML, ByVal  0 &,  0 , ThreadID)
' модуль
Public Sub LOADHTML()
Dim RetVal As Long
    DeleteUrlCacheEntry MyHTTP
    RetVal = URLDownloadToFile( 0 , MyHTTP, MyFILE,  0 ,  0 )
    ThRESUME = True ' это паблик переменная, чтобы основной поток знал,
                    ' что поток LOADHTML отработал и завершился, после чего можно и RetVal проверить.
End Sub
Стандартный вызов функции, только не из основного потока.
...
Рейтинг: 0 / 0
URLDownloadToFile в отдельном потоке
    #36598760
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeleteUrlCacheEntry MyHTTP

у тебя потоки будут каждый друг дружке портить кэш во время работы
...
Рейтинг: 0 / 0
URLDownloadToFile в отдельном потоке
    #36598783
Guest v.22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One,

Потоки одновременно не работают. Мне просто надо, чтобы программа не "висела".
И даже если будут работать одновременно, то MyHTTP указан разный для каждого случая. Разве попортят кэш?
Ну, это я просто так спросил, хотя и интересно.
С закоментированным DeleteUrlCacheEntry тоже ничего не работает. Причем я уж при тестировании не все страницы прогоняю, а одну конкретную, которая "плохая"... все равно не грузит.
А в основном потоке - грузит!
...
Рейтинг: 0 / 0
URLDownloadToFile в отдельном потоке
    #36598796
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а не проще это решить через сервис или задание. зачем тебе извращение с потоками в VB?
а проблема ,думаю, в правах. поток не получает каких-то прав на выполнение своих действий.
...
Рейтинг: 0 / 0
URLDownloadToFile в отдельном потоке
    #36598819
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот неплохая реализация нитей для VB
...
Рейтинг: 0 / 0
URLDownloadToFile в отдельном потоке
    #36598822
Guest v.22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_Oneа не проще это решить через сервис или задание. зачем тебе извращение с потоками в VB?
а проблема ,думаю, в правах. поток не получает каких-то прав на выполнение своих действий.Да какое извращение?!
Одна строчка кода всего:
Код: plaintext
1.
ThTHREAD = CreateThread(ByVal  0 &, ByVal  0 &, AddressOf LOADHTML, ByVal  0 &,  0 , ThreadID)
Походя написал.
А вот сервис и задание - это уже повозиться надо будет.
А что может быть не так с правами? 75% страниц же качаются нормально. Я понимаю, если б всё отрубилось.
...
Рейтинг: 0 / 0
URLDownloadToFile в отдельном потоке
    #36598825
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
25% оставшихся страниц наверное имеют формы с параметрами или SSL?
...
Рейтинг: 0 / 0
URLDownloadToFile в отдельном потоке
    #36598829
Guest v.22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One вот неплохая реализация нитей для VBДа проблема-то вроде не с ними. Хотя посмотреть любопытно.
Попробую с правами поиграться.
...
Рейтинг: 0 / 0
URLDownloadToFile в отдельном потоке
    #36598832
Guest v.22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One25% оставшихся страниц наверное имеют формы с параметрами или SSL?Все с парметрами. Все до единой. Однако вот...
...
Рейтинг: 0 / 0
URLDownloadToFile в отдельном потоке
    #36599161
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, самый простой способ асинхронно загрузить файл без использования API - воспользоваться методом AsyncRead UserControl-a...
...
Рейтинг: 0 / 0
URLDownloadToFile в отдельном потоке
    #36599417
Фотография BION
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может это поможет.
...
Рейтинг: 0 / 0
URLDownloadToFile в отдельном потоке
    #36600377
Guest v.22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасип.
Вот что выяснилось у меня.
Когда-то, еще при первом вызове URLDownloadToFile из потока, я что-то сделал с ошибкой и ни одна страница не загрузилась.
Потом поправил, стало работать.
Но те самые "плохие" страницы (что с ними не так? - не пойму) прописались в кэш намертво. Что их нету.
Причем только, когда они грузятся именно в потоке. Как это запоминается и где?! Не пойму. Хоть в IDE, хоть скомпилированная в EXE - кто-то в виндовс помнит, что этот поток ломился на данную страницу, а ее - нету! И подсовывает соответственно. А в основном потоке - нормально.
DeleteUrlCacheEntry ничего не делает. Я вообще не пойму, зачем он нужен, "хорошие" страницы и без него отдают свежие данные, в "плохих" он бесполезен совершенно.

На форуме шарпистов, которые решили поиграться с API, случайно обнаружил, что перед URLDownloadToFile они зачем-то запускают CoInitialize(Null).
Я собезьянничал, тоже в начало потока записал CoInitialize 0, и все заработало. Кэш незагруженных страниц сбрасывается, или, подозреваю, не используется вообще.
Для красоты в конец потока записал CoUninitialize.
Теперь пытаюсь разобраться, что это такое я прикрутил. Есть подозрения, что дело было не в кэше, хотя он тут каким-то боком имеет место быть.
...
Рейтинг: 0 / 0
URLDownloadToFile в отдельном потоке
    #36600387
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CoInitialize для внедрения вашего потока в память основного процесса вашей программы
...
Рейтинг: 0 / 0
URLDownloadToFile в отдельном потоке
    #36600394
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. происходит инициализация механизма COM для вашего потока, возможно на этом этапе и наследуются все права основного процесса
...
Рейтинг: 0 / 0
URLDownloadToFile в отдельном потоке
    #36600459
Guest v.22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Аа, понятно.
Т.е. CoUninitialize не нужен? Зачем поток убирать из памяти основного процесса, тем более, что он (поток) на следующем шаге сам закроется?
И дело, похоже, не в правах.
После однократного применения CoInitialize, пробовал при следующих запусках обойтись без него - все нормально. До тех пор, пока сеть не отключить и снова получить незагруженный файл. После этого страница становится недоступной, пока снова CoInitialize хотя бы однократно не применю.

И вопрос... собственно для чего я и запускал закачку в отдельном потоке.
Если вижу, что на какой-то странице процесс загрузки остановился и завис, что лучше сделать?
Управление-то у меня осталось.
Освободить все объекты и TerminateThread? А вдруг в виндах загрузка на каком-то СОМе останется висеть?
Или лучше всю программу завершить (корректно), при этом вроде все ресурсы должны освободиться?

Спасибо.
...
Рейтинг: 0 / 0
URLDownloadToFile в отдельном потоке
    #36600464
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если вы создаёте поток, то вы его и должны завершать.
...
Рейтинг: 0 / 0
URLDownloadToFile в отдельном потоке
    #36605067
Guest v.22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Образовалось два вопроса:
1.
Код: plaintext
ThTHREAD = CreateThread(ByVal  0 &, ByVal  0 &, AddressOf functionLOADHTML, ByVal  0 &,  0 , lpThreadID)
При создании потока я имею следующие сведения о нем (два): ThTHREAD и lpThreadID
Как его правильней закрыть? А то даже у Эпплмена реализованы оба подхода:
Код: plaintext
TerminateThread ThTHREAD, ByVal  0 &
и через хендл:
Код: plaintext
1.
2.
3.
4.
5.
ThreadHandle = OpenThread( 1 &,  0 &, lpThreadID)
If ThreadHandle Then
    TerminateThread ThreadHandle,  0 &
    CloseHandle ThreadHandle
End If
Работают оба. Как все-таки правильно в Windows ХР?
2.
Иногда при убитии потока (который грузил страницу в файл), этот файл остается заблокированным.
Как-нибудь можно эту блокировку снять? Файл-то заблокирован моим приложением, права должны быть.
Спасибо.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / URLDownloadToFile в отдельном потоке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]