Суть простая тулза которая отчекивает заданный список доменов по ключевому слову. Я пока только разбираюсь в Builder так что сильно не пинайте, использую в проекте libcurl и многопоточность с помощью TTreads, проблема в том что приложение работает не совсем корректно, заносит в файлы good.txt и bad.txt не понятно каким образом ниже приведу код буду благодарен тем кто сможет помочь в отлове ошибки. Code: #include <vcl.h> #pragma hdrstop #include "Unit3.h" #include <Unit1.h> #pragma package(smart_init) #pragma resource "*.dfm" TForm3 *Form3; int max; int count=0; FILE* f1; FILE* f2; TStringList *DomainList = new TStringList; static size_t Writer(char *data, size_t size, size_t nmemb, AnsiString *buffer) { size_t result = 0; if(buffer != NULL) { buffer->Insert(data,buffer->Length()+1); //заполняем переменную buffer result = size * nmemb; // формируем значение количества переданных //байт данных } return result; } __fastcall TForm3::TForm3(TComponent* Owner) : TForm(Owner) { } __fastcall Thread::Thread(bool CreateSuspended) : TThread(CreateSuspended) { } void __fastcall Thread::Execute() { HINSTANCE cl = NULL; if( ( cl = LoadLibrary( "libcurl.dll" ) ) == NULL ) MessageBox(NULL, "I can't load libcurl","ERROR", 0); TStringList *tfile = new TStringList; bool check=true; FreeOnTerminate= true; String data,url,filename; EnterCriticalSection(&Form3->CS); CURL *curl; curl = curl_easy_init(); while(check){ if(count<max){ data=""; url=""; url= DomainList->Strings[count]; count++; curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,Writer); curl_easy_setopt(curl, CURLOPT_WRITEDATA,&data); curl_easy_setopt(curl, CURLOPT_URL,url); curl_easy_setopt(curl, CURLOPT_HEADER , 1 ); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); curl_easy_perform(curl); LeaveCriticalSection(&Form3->CS); //curl_easy_cleanup(curl); tfile->Add(data); filename= IntToStr(count)+".txt"; tfile->SaveToFile(filename); tfile->Clear(); data.LowerCase(); Form3->Label1->Caption = url;//DomainList->Strings[count]; if(data.Pos("under construction")<0){ f1= fopen("good.txt","a+"); fputs(DomainList->Strings[count].c_str(),f1); fputs("\n",f1); fclose(f1); }else{ f2= fopen("bad.txt","a+"); fputs(DomainList->Strings[count].c_str(),f2); fputs("\n",f2); fclose(f2); } }else{ FreeLibrary(cl); check = false; Terminate(); } } } void __fastcall TForm3::Button1Click(TObject *Sender) { DomainList->LoadFromFile("domains.txt"); max= DomainList->Count-1; InitializeCriticalSection(&CS); Thread *T[3]; for(int i=0;i<3;i++){ T[i] = new Thread(false); } }
Крит.секция используется там, где не нужно. Нет смысла делать несколько потоков, если работа с сетью в крит.секции. И наоборот, там где нужна синхронизация, ее нет.