Форум » GUI » [Пример] Загрузка файла из интернета » Ответить

[Пример] Загрузка файла из интернета

SkyNET: Здравствуйте ! Написал тут небольшую программку для скачивания файла из интернета. Она использует мультипоточность и работу с сокетами. Программа лежит здесь (компилировать download.prg или запустить download.exe) Пришлось модифицировать библиотеку tsocket.prg Я добавил в неё метод ReceiveCustom(число получаемых байт): [more][quote]METHOD ReceiveCustom(nBufLen) CLASS TSocket local cRet := "" local cBuf := space(nBufLen) local nRet ::PrintDebugMessage("Receive custom string, len: " + STR(nBufLen)) nRet := SocketReceive( ::m_hSocket, @cBuf, ::nReceiveTimeout ) cRet := substr( cBuf, nBufLen, nRet ) ::PrintDebugMessage( "Received " +cRet ) Return cRet[/quote][/more] Он помогает получить заданное число байт из сокета. Я использовал его так как ReceiveChar() получает только один символ, что совсем недостаточно, ReceiveLine() подходит только для линий, а с бинарной датой это не подходит, и ReceiveString() получает весь текст, без возможности обработать определенный фрагмент. Картинка программы: Был бы рад, если бы мой метод библиотеки добавили в новую версию MiniGUI, ну и также сам пример, конечно. Комментарии на русском, могу, если надо, перевести на английский

Ответов - 9

gfilatov2002: SkyNET пишет: Был бы рад, если бы мой метод библиотеки добавили в новую версию MiniGUI Большое спасибо! Так и сделаю, чтобы и другим разработчикам была польза. SkyNET пишет: могу, если надо, перевести на английский Да, это также желательно сделать. Жду с нетерпением...

SkyNET: Завершил полный перевод, включая комментарии. Теперь есть две версии: русская и английская Вот архив с английской версией. Заранее спасибо

gfilatov2002: SkyNET пишет: Вот архив с английской версией. Большое спасибо за авторский перевод! Замечание: для правильной работы примера пришлось сделать небольшое изменение в коде tsocket.prg (новый метод ReceiveCustom): METHOD ReceiveCustom(nBufLen) CLASS TSocket local cRet := "" local cBuf := space(nBufLen) local nRet ::PrintDebugMessage("Receive custom string, len: " + STR(nBufLen)) nRet := SocketReceive( ::m_hSocket, @cBuf, ::nReceiveTimeout ) cRet := substr( cBuf, 1, nRet ) // изменил здесь на 1 ::PrintDebugMessage( "Received " +cRet ) Return cRet


SkyNET: Я случайно выложил старую версию библиотеки, которая не работала, извините. Поправил код во всех версиях на сайте. P.S: Извините за долгий ответ, были проблемы с интернетом...

SkyNET: Обновился до новой версии MiniGUI ((Build 98) - 2011.07.27). Если заменяю стандартную библиотеку tsocket на свою, то ничего не работает, падает с ошибкой. В чём проблема ?

SkyNET: Всем привет ! У меня возникла новая проблема - на медленном модеме не всегда приходит ответ от сервера. Причём никакой ошибки не возникает, поток просто ничего не делает. Поэтому вопрос: Как остановить и/или завершить поток (можно даже через другой) через определенный промежуток времени ? Например 60 секунд. В документации по Harbour нет никакого упоминания о них, а функции из xHarbour не работают. Версия MiniGui 2.0.2

SkyNET: Обновил Downloader, добавил в него проверку на наличие ошибок при загрузке файла Теперь, если HTTP статус ответа сервера не 200, то загрузки файла не происходит. Новые исходники здесь.

gfilatov2002: SkyNET пишет: Обновил Downloader Большое спасибо! Это обновление, конечно, будет включено в следующую сборку

Andrey: Как получить результат работы потока ? Т.е. я в потоке после выполнения задачи (публичной переменной присваиваю T или F). Как мне её получить после выполнения потока, а то она у меня всегда F, т.е. как дождаться в основной программе окончания потока ? Вот на этом примере: // On Click of Button "Download file" PROCEDURE ButtonMain LOCAL threadA PUBLIC lRezultat := .F. Win_1.Button_2.Enabled := .F. Win_1.Button_2.Caption := "Loading..." // Start a new Thread threadA := hb_threadStart( HB_THREAD_INHERIT_PUBLIC, @DownloadFile() ) hb_threadDetach( threadA ) MsgInfo(M->lRezultat) // Т.е. переменная не дожидается окончания потока ! RETURN



полная версия страницы