Чекалка доменов на Builder

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Gin, 26 May 2010.

  1. Gin

    Gin Elder - Старейшина

    Joined:
    11 Sep 2008
    Messages:
    133
    Likes Received:
    7
    Reputations:
    4
    Суть простая тулза которая отчекивает заданный список доменов по ключевому слову. Я пока только разбираюсь в 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);
    }
    
    }
    
     
    1 person likes this.
  2. Meecript_

    Meecript_ Banned

    Joined:
    29 Oct 2008
    Messages:
    194
    Likes Received:
    62
    Reputations:
    32
    Крит.секция используется там, где не нужно. Нет смысла делать несколько потоков, если работа с сетью в крит.секции.
    И наоборот, там где нужна синхронизация, ее нет.