Здравствуйте форумчане! в общем не знаю куда копать. запутался совсем. все на что думал вроде пофиксил. но проблема так и осталась. переписывал три раза. непомогло в общем вот кусок кода (сам цикл-сендер): Code: while(fr_id<=fr_count) { String hash; String wall_hash; try{ // Form1->MemoLog->Lines->Add("заходим на профайл: "+friends->Strings[fr_id]); profile_page=http->Get("http://vkontakte.ru/id"+friends->Strings[fr_id]); }catch(...){} Form1->MemoLog->Lines->Add("находимся на профайле: "+friends->Strings[fr_id]); // Form1->MemoLog->Lines->Add("ждем 3 сек"); ::Sleep(3000); //ищем стену if(profile_page.Pos("javascript: show_quick_reply()")) { send_detect=1; } //ищем микроблог if(profile_page.Pos("<div id=\"postIt\">")) { send_detect=1; } try{ if(send_detect==1) { AnsiString name; // Form1->MemoLog->Lines->Add("парсим имя"); profile_page.Delete(1, profile_page.Pos("<title>В Контакте | ")+19); name=profile_page.SubString(1, profile_page.Pos(" ")-1); //грабим хэш // Form1->MemoLog->Lines->Add("грабим хэш"); profile_page.Delete(1, profile_page.Pos("postWall(")+8); profile_page.Delete(1, profile_page.Pos(" '")+1); hash=profile_page.SubString(1, profile_page.Pos("'")-1); wall_hash=ReverseString(hash.SubString(hash.Length() - 4, 5) + hash.SubString(5, hash.Length() - 12)); // Form1->MemoLog->Lines->Add("подставляем имя"); if(str.Pos("<name>")) { str.Insert(name,str.Pos("<name>")); str.Delete(str.Pos("<name>"),+6); } AnsiString wall_cap_page; // post->Add("act=a_post_wall"); // post->Add("hash="+wall_hash); // post->Add("message="+UTF8Encode(str)); // post->Add("to_id="+friends->Strings[fr_id]); // post->Add("top_id="); // post->Add("type=0"); try{ // Form1->MemoLog->Lines->Add("отправляем"); wall_cap_page=http->Get("http://vkontakte.ru/wall.php?act=a_post_wall&hash="+wall_hash+"&message="+UTF8Encode(str)+"&to_id="+friends->Strings[fr_id]+"&top_id="+"&type=0"); }catch(...) { Form1->MemoLog->Lines->Add("Ошибка при отправке"); } // Form1->Label2->Caption=mess_count; //обработка капчи while (wall_cap_page.Pos("captcha_sid")) { // Form1->MemoLog->Lines->Add("запуск цикла обработки капчи"); //String wall_cap_sid; pause=1; wall_cap_sid=wall_cap_page.SubString(wall_cap_page.Pos("captcha_sid")+14,+12); // Form1->MemoLog->Lines->Add("дергаем капчу"); http->Get("http://vkontakte.ru/captcha.php?s=1&sid="+wall_cap_sid,wall_cap); wall_cap->SaveToFile(wall_cap_sid+".jpg"); // Form1->Image1->Picture->LoadFromFile(wall_cap_sid+".jpg"); Synchronize(UpdateImage); wall_cap->Clear(); // Form1->MemoLog->Lines->Add("удаляем капчу"); DeleteFile(wall_cap_sid+".jpg"); cap_count++; // Form1->Label4->Caption=IntToStr(cap_count); while (pause>0) { ::Sleep(3000); } try{ //post->Add("captcha_sid="+wall_cap_sid); //post->Add("captcha_key="+Form1->Edit1->Text); // Form1->MemoLog->Lines->Add("отправляем"); wall_cap_page=http->Get("http://vkontakte.ru/wall.php?act=a_post_wall&hash="+wall_hash+"&message="+UTF8Encode(str)+"&to_id="+friends->Strings[fr_id]+"&top_id="+"&type=0"+"&captcha_sid="+wall_cap_sid+"&captcha_key="+Form1->Edit1->Text); }catch(...){} pause=1; // Form1->MemoLog->Lines->Add("конец цикла обработки капчи"); }//конец цикла обработки капчи //post->Clear(); Form1->MemoLog->Lines->Add("отправлено на стену "+friends->Strings[fr_id]); mess_count++; // Form1->MemoLog->Lines->Add("удаляеи имя"); //удаляем из стринга имя if(str.Pos(name)) //while { str.Insert("<name>",str.Pos(name)); str.Delete(str.Pos(name),name.Length()); } //удаляем из стринга имя }//if send_detect }catch(...){Form1->MemoLog->Lines->Add("ошибка в цикле рассылки или ак невалиндный");} send_detect=0; fr_id++; // Form1->MemoLog->Lines->Add("делаем паузу"); ::Sleep(7000); // Form1->MemoLog->Lines->Add("конец цикла рассылки"); }//конец цикла рассылки в нем где то что то нетак. что именно нифига немогу догадаться... отправляет неболее 80 мессаг. в процессе сборки на более раннем этапе умудрялся отправить целых 480 мессаг. после устранения всех возможных как мне казалось неисправностей перестал слать больше 80... при том нет какой либо закономерности. вбиваю ак->Start-> итого до момента зависания отправлено 11, хня, вбиваю еще раз этот ак, может отправить 6 и зависнет. вбиваю тот же ак еще раз ->80 мессаг дальше виснет. в общем надеюсь на ваш совет. над архитектурой просьба нестебаться. это мой первый спамер. пробывал убирать/заменять все прямые обращения из потока к визуальным компонентам - результата нет. p.s: неговорить что где то что то не объявлено и не удаляется. в этом куске просто невидно. но проблема именно в нем(как мне думается ). потому как когда прога работает, на момент зависания работает только этот цикл. в общем вот. надеюсь на помощь. заранее благодарю. p.p.s: обработку ошибок более менее сделал, но они невылазят вобще. upd: обновил код. немного не тот сначала запостил.
2good_man смотреть стек зависшего потока подключившись к проге когда та зависнет или запускать сразу под отладчиком ждать когда зависнет делать break all и смотреть кто на чем остановился ну и можно вставить трейс в цикл тогда и без отладчика поймете где зависает ЗА ВАС ЖЕ НИКТО НЕ ЗАПУСТИТ ОТЛАДЧИК И НЕ СТАНЕТ ЭТО СМОТРЕТЬ юзайте трейс самое простое и одно из самых эффективных средств после отладчика Code: #define PRINT 1 #if PRINT #define trace(fmt, ...) trace_impl(fmt, __VA_ARGS__) #else #define trace(fmt, ...) do {} while(0) #endif void trace_impl(const char *fmt, ...){ CString s; va_list va; va_start(va, fmt); s.FormatV(fmt, va); OutputDebugString(s); } int main(){ trace("[%x] ... \n", GetCurrentThreadId()); } Dbgview.exe скачайте чтоб смотреть трейс
смотрел под дебаггером. ниче непонял если чесно. выдает хрень сокет еррор там какойто (вспомнил - 10093 = Не выполнена функция WSAStartup перед использованием любой другой фукнции работы с сокетами). но у меня везде где идет запрос есть try{}catch(...){} обработка. я ее (обработку) пихал по началу вобще где только можно. гонял софтину но ниодна ошибка так и невывалилась там где есть обработка. разве что не делал логирование проходов всех циклов и каждой строчки выполненого кода хотя если что так и поступлю. просто еще есть мысли по поводу каких нибудь камней в вк. но нифига непойму. за грамматические и прочие ошибки просьба непинать. тороплюсь уходить и неспал сутки
антигейт юзаешь? ато из кода непонял если да - то возможно проблема изза него. сегодня такое встречалось
1n0y нет антигейт пока еще не прикрутил, пока тестю только с ручным вводом. в общем на фигачил лог почти после каждой строчки... сча буду смотреть...
блин жалко, что дата в сообщениях не указываеца. Вчера контакт упал. (моя прога и сервер тоже зависали при авторизации и тд) И они сену поменли полностью в режим микроблога. Много чего изменилось.
хм... незамечал вчера ниче такого у себя. не заметил изменений кроме: пропала строчка javascript: show_quick_reply() в исходнике и вместо нее осталась только: <div id="postIt"> upd: + появились некоторые параметры на которые вроде ваще пох. это же просто однопоточная игрушка... и я не спамер спам в научных целях только.