Автор | Сообщение |
|
| |
Пост N: 90
Зарегистрирован: 23.06.08
|
|
Отправлено: 19.08.11 00:22. Заголовок: [Пример] Загрузка файла из интернета
Здравствуйте ! Написал тут небольшую программку для скачивания файла из интернета. Она использует мультипоточность и работу с сокетами. Программа лежит здесь (компилировать download.prg или запустить download.exe) Пришлось модифицировать библиотеку 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, nBufLen, nRet ) ::PrintDebugMessage( "Received " +cRet ) Return cRet |
|
| Он помогает получить заданное число байт из сокета. Я использовал его так как ReceiveChar() получает только один символ, что совсем недостаточно, ReceiveLine() подходит только для линий, а с бинарной датой это не подходит, и ReceiveString() получает весь текст, без возможности обработать определенный фрагмент. Картинка программы: Был бы рад, если бы мой метод библиотеки добавили в новую версию MiniGUI, ну и также сам пример, конечно. Комментарии на русском, могу, если надо, перевести на английский
|
|
|
Ответов - 9
[только новые]
|
|
|
| moderator
|
Пост N: 241
Зарегистрирован: 11.02.10
|
|
Отправлено: 19.08.11 10:13. Заголовок: SkyNET пишет: Был б..
SkyNET пишет: цитата: | Был бы рад, если бы мой метод библиотеки добавили в новую версию MiniGUI |
| Большое спасибо! Так и сделаю, чтобы и другим разработчикам была польза. SkyNET пишет: цитата: | могу, если надо, перевести на английский |
| Да, это также желательно сделать. Жду с нетерпением...
|
|
|
|
| |
Пост N: 91
Зарегистрирован: 23.06.08
|
|
Отправлено: 19.08.11 20:19. Заголовок: Завершил полный пере..
Завершил полный перевод, включая комментарии. Теперь есть две версии: русская и английская Вот архив с английской версией. Заранее спасибо
|
|
|
|
| moderator
|
Пост N: 242
Зарегистрирован: 11.02.10
|
|
Отправлено: 20.08.11 21:15. Заголовок: SkyNET пишет: Вот а..
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 |
|
|
|
|
|
| |
Пост N: 92
Зарегистрирован: 23.06.08
|
|
Отправлено: 27.08.11 21:15. Заголовок: Я случайно выложил с..
Я случайно выложил старую версию библиотеки, которая не работала, извините. Поправил код во всех версиях на сайте. P.S: Извините за долгий ответ, были проблемы с интернетом...
|
|
|
|
| |
Пост N: 93
Зарегистрирован: 23.06.08
|
|
Отправлено: 01.09.11 15:55. Заголовок: Обновился до новой в..
Обновился до новой версии MiniGUI ((Build 98) - 2011.07.27). Если заменяю стандартную библиотеку tsocket на свою, то ничего не работает, падает с ошибкой. В чём проблема ?
|
|
|
|
| |
Пост N: 94
Зарегистрирован: 23.06.08
|
|
Отправлено: 31.10.11 23:03. Заголовок: Всем привет ! У меня..
Всем привет ! У меня возникла новая проблема - на медленном модеме не всегда приходит ответ от сервера. Причём никакой ошибки не возникает, поток просто ничего не делает. Поэтому вопрос: Как остановить и/или завершить поток (можно даже через другой) через определенный промежуток времени ? Например 60 секунд. В документации по Harbour нет никакого упоминания о них, а функции из xHarbour не работают. Версия MiniGui 2.0.2
|
|
|
|
| |
Пост N: 100
Зарегистрирован: 23.06.08
|
|
Отправлено: 27.03.13 22:41. Заголовок: Обновил Downloader, ..
Обновил Downloader, добавил в него проверку на наличие ошибок при загрузке файла Теперь, если HTTP статус ответа сервера не 200, то загрузки файла не происходит. Новые исходники здесь.
|
|
|
|
| moderator
|
Пост N: 457
Зарегистрирован: 11.02.10
|
|
Отправлено: 28.03.13 15:12. Заголовок: SkyNET пишет: Обнов..
SkyNET пишет: Большое спасибо! Это обновление, конечно, будет включено в следующую сборку
|
|
|
|
| постоянный участник
|
Пост N: 3024
Зарегистрирован: 12.09.06
|
|
Отправлено: 19.10.13 18:00. Заголовок: Как получить результ..
Как получить результат работы потока ? Т.е. я в потоке после выполнения задачи (публичной переменной присваиваю 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
|
|
|
|