| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Сети > idHTTP в рабочем потоке |
| Автор: schnaps 30.3.2010, 18:49 | ||||||
| Здравствуйте! собственно возникает такая незадачка: запускаю idHHTP в отдельном потоке (по нажатию кнопки в основном), и пока рабочий поток что то выкачивает, то основная форма подвисает, я недоумеваю. вот код рабочего потока:
а вот код запуска потока
в догонку еще вопрос: в настройках IdHTTP выставляю вот так
а эта сволочь возвращает мне UTF8 |
| Автор: Matematik 30.3.2010, 19:14 |
Обрати внимание на строки 6 и 13 Подозреваю, сервер просто игнорирует поле. |
| Автор: schnaps 30.3.2010, 19:28 |
| эм.... ну да А по поводу сервера, скажу по секрету, вчера как то колупал конкрентный сервер, он мне выдавал в win-1251, но настроек idHTTP не помню, потому как проект убил, кажется вообще дефолтные были,а эти я взял из снифера и подкрутил чтоб utf8 не раздавал, но не врубаюсь почему команда игнорируется |
| Автор: Akella 31.3.2010, 15:02 |
а что ты этим хочешь сделать? Добавлено через 53 секунды Используй ExtraHeaders. |
| Автор: Matematik 31.3.2010, 17:41 | ||||
AcceptEncoding , как следует из названия, только указывает какие кодировки понимает клиент. Это не приказ серверу в какой кодировке посылать данные. Логично что сервер не будет для каждого клиента преобразовывать кодировку. GET / HTTP/1.1 Host: ya.ru Accept: text/html, */* Accept-Encoding: windows-1251 User-Agent: Mozilla/3.0 (compatible; Indy Library) HTTP/1.1 200 OK Server: nginx Date: Wed, 31 Mar 2010 14:40:04 GMT Content-Type: text/html; charset=utf-8 Content-Length: 4962 Last-Modified: Tue, 12 Jan 2010 15:29:04 GMT Connection: keep-alive Accept-Ranges: bytes <!DOCTYPE HTML PUBLIC |
| Автор: Akella 31.3.2010, 20:01 |
Вот. Вот. schnaps, это ты должен узнать в какой кодировке сервер отдаёт информацию и работать уже дальше с этой кодировкой. |
| Автор: schnaps 1.4.2010, 05:09 |
| Ладно, кодировка пес с ней, уговорили |
| Автор: Mikel 2.4.2010, 21:54 | ||||
Почитайте про работу с потоками. Примерно так должно выглядеть:
|
| Автор: Демо 2.4.2010, 22:12 | ||
| 1. См. сообщение от Mikel http://forum.vingrad.ru/index.php?showtopic=295985&view=findpost&p=2128578 2. Всё неправильно.
Ты не понял сам, что в этом коде происходит. По строкам: 1. NewThread := TGetHTML.Create; //Создаём доп. нить - всё в порядке. 2. NewThread.FreeOnTerminate := True; //Указываем, что объект нашего класса будет уничтожен сразу после того, как выполнится поточная функция (на OnTerminate не будем обращать внимание - у тебя его нет). 3. NewThread.URL := 'пусть будет yandex.ru'; /Присваиваем адрес URL. Здесь пока в порядке 4. NewThread.Resume; //В этот момент поточная функция начинает исполняться и вызывается Execute В ней выполняется запрос. Обрати внимание на следущую строчку. 5. memo1.Lines.Add(NewThread.WebPage); //В этот момент ты вызываешь с какого-то перепугу метод потока, который вызывает Execute (что совершенно неправильно). Но это ещё полбеды. Метод Execute ты выполняешь как обычную процедуру в основном потоке. Естественно, что в этот момент форма не обновляется. Но этого мало. В этот момент Execute, который начал работать после NewThread.Resume может закончить выполнение, после чего твой поток успешно самоуничтожится, но Execute, который ты вызвал в основном потоке, ещё продолжает выполняться. У тебя не возникает AV только из-за того, что метод Execute статический. 6. finally NewThread.Free; Мало того, что поток ранее уже самоуничтожился, ты пытаешься его здесь убить ещё раз. Добавлено через 5 минут и 10 секунд Итог: без изучения принципов многопоточной разработки мало что получится. http://forum.vingrad.ru/forum/topic-60076.html http://www.almar.net.ru/dokuwiki/doku.php?id=articles:00000 |