Может кто нить будь дать простой пример работы с AC в билдере, Тупо отправка капчи - Ожидание - Прием Спасибо Желательно пример с Id Http а не на сокетах Компилятор желательно C++ Builder 6 или 9
PHP: //--------------------------------------------------------------------------- String CheckCaptcha(String filename, String apikey, bool is_phrase, bool is_regsense, bool is_numeric, int min_len, int max_len) { String sFtype = "image/pjpeg"; String sTmpstr = ""; String sCaptcha_id = ""; TIdMultiPartFormDataStream *multi = new TIdMultiPartFormDataStream; TIdHTTP *http = new TIdHTTP(0); multi->AddFormField("method", "post"); multi->AddFormField("soft_id", "5"); multi->AddFormField("key", apikey); multi->AddFile("file", filename, sFtype); if(is_phrase) multi->AddFormField("phrase", "1"); if(is_regsense) multi->AddFormField("regsense", "1"); if(is_numeric) multi->AddFormField("numeric", "1"); if(min_len) multi->AddFormField("min_len", IntToStr(min_len)); if(max_len) multi->AddFormField("max_len", IntToStr(max_len)); sTmpstr = http->Post("http://antigate.com/in.php", multi); if(sTmpstr.Pos("ERROR_")) { delete multi; delete http; return sTmpstr; } if(sTmpstr.Pos("OK")) { sCaptcha_id = sTmpstr.SubString(sTmpstr.Pos("|") + 1, sTmpstr.Length() - sTmpstr.Pos("|")); } if(sCaptcha_id == "") { delete multi; delete http; return "ERROR: bad captcha id!"; } for(int i = 0; i < 12; i++) { Sleep(5000); sTmpstr = http->Get("http://antigate.com/res.php?key="+apikey+"&action=get&id="+sCaptcha_id); if(sTmpstr.Pos("ERROR_")) { delete multi; delete http; return sTmpstr; } if(sTmpstr.Pos("OK|")) { delete multi; delete http; return sTmpstr.SubString(sTmpstr.Pos("|") + 1, sTmpstr.Length() - sTmpstr.Pos("|")); } } delete multi; delete http; return "ERROR_TIMEOUT!"; } //---------------------------------------------------------------------------
не подскажете как в 6 ом билдере это осуществить? ругается на TIdMultiPartFormDataStream *multi = new TIdMultiPartFormDataStream;
M_script, а вы по-прежнему передаете через стек в функции целые объекты типа string, вместо того, чтобы пользоваться ссылками и указателями? Это же чрезвычайно неэффективно.
#include <IdMultipartFormData.hpp> неробит. вроде как для билдера 6.0 класс отсутствует. прочитал в гугле. можно так поступить? TMemoryStream*cap=new TMemoryStream(); cap->LoadFromFile("captcha.jpg"); и передать?
Правильнее было бы заменить это: На Code: void CheckCaptcha(String& filename, String& apikey, String& answer, bool is_phrase, bool is_regsense, bool is_numeric, int min_len, int max_len) Тут, вместо полного копирования объектов, будут передаваться лишь адреса на них. Вместо того, чтобы возвращать целый объект String из функции, что опять-таки приведет к его копированию, проще сделать параметр String& answer, чтобы функция могла в него записать необходимую информацию. Функцию придется немного переписать, но мы выиграем в быстродействии и сэкономим память. Можно, конечно, вернуть из функции указатель или ссылку на созданный динамически внутри функции объект String, но тогда придется его потом удалять вне тела функции после использования.
Вся эффективность теряется на тле протокола http, я не против оптимизации кода, просто если уже идти по вашей цепочке. Прощай С++ builder -> прощай curl -> привет сокеты (ведь это тоже потеря эффективности)
Я говорю не о теле протокола хттп (кстати что это вообще такое, вы сами придумали понятие?), я говорю о том, что через стек передавать объекты целиком очень неэффективно, это вызывает их копирование. Представьте, что вы хотите передать строку длиной 1000 символов в функцию. Так вот с таким подходом мы в итоге будем иметь две строки по 1000 символов, одна из которых по выходу из тела функции удалится. И это относится ко всем функциям, пусть мы пишем даже простой хеллоу ворлд, и ко всем компиляторам, а не только к билдеру. Стандарт для всех один.
Я это всё к тому что, вся эффективность теряется на стороне антикапчи, и тут как не оптимизируй быстрее не станет. з.ы я не противник ссылок.
Памяти меньше однозначно, но на соврмн. машинах это не столь чувствительно. Оптимизируй везде где только возможно. (с) slesh
GRRRL Power, я еще локальную копию ключа антигейта создаю в каждом потоке, столько памяти теряется, просто ужас. Если это так интересно, я не использую эту функцию. Поймите смысл - мои программы работают быстро и стабильно, а времени на их написание уходит очень мало. Это и требуется клиентам. Им не интересно, как объявлен массив TThread и как передаются параметры функции. Плохо конечно, что из-за функции распознавания капчи мы за сутки работы программы потеряем времени от пары секунд до нескольких минут, но для кого это важно?
С таким подходом к делу вам сложно будет писать сложные проекты... Там потерялось 10 секунд, тут 10, там 1 мегабайт, тут 1 - и в итоге получаем программу, которая грузится 20 минут и жрет 500 мегабайт памяти при скудном функционале. Представьте себе, что многие веб-программисты тоже рассуждают "а, не буду делать здесь проверку, все равно никто sql-инъекцию не применит, кому это надо". А потом хоп - и сайт сломан. А, ладно. Не мне вас учить. Поддерживаю slesh'а, он советует верно. И если не там, где только возможно, то хотя бы там, где необходимо.
Не соглашусь. Практически ни в одной программе не требуется оптимизация всего кода. Только тех участков, производительность которых не устраивает. Если оптимизировать все и вся - времени на написание программы потребуется в РАЗЫ больше. Вообще говоря: 1) напиши 2) посмотри, устраивает ли производительность 3) если не устраивает - найди узкие места и оптимизируй. Я промолчу, что оптимизация начинается с архитектуры... UPD: Уточню, что я имею в виду: Я не согласен с тем утверждением, что нужно оптимизировать все, что можно. Нужно писать код, отдавая себе отчет о том, как он будет работать, какие побочные эффекты вызовут те или иные решения. И только по факту нехватки производительности/перерасхода памяти/т.п. - заниматься оптимизацией отдельных участков кода. Но для этого надо хорошо понимать, что творится в коде, и отлично владеть навыками проектирования, алгоритмизации и кодирования. В противном случае - забудьте о сколько-нибудь серьезных проектах, ваш удел - различные вариации "Hello World". Например, сложно представить, чтобы опытный и умелый прогер передавал здоровенные параметры по значению, вместо простой, удобной и быстрой передачи по ссылке.
блин... как исправть чтоб в билдере 6.0 работал IdMultipartFormData.hpp выдает ошибку E2209 Unable to open include file IdMultipartFormData.hpp Update: ее! в общем обновил инди ) OK|40541753