[ Delphi / Pascal ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by banned, 6 May 2007.

Thread Status:
Not open for further replies.
  1. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    С данным алгоритмом на любом языке будет работать медленно, потому что на каждую строку первого файла заново считывается весь второй файл.

    Максимально быстро будет работать такой вариант:
    1) Преобразовать ab.txt
    в ba.txt
    2) Отсортировать ba.txt в алфавитном порядке
    3) Преобразовать ba.txt + bc.txt в ac.txt за один проход без вложенных циклов.
     
    1 person likes this.
  2. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    Под StringList переделать можно, так же можно удалять уже найденные позиции, чтобы сократить время последующих проходов, но такая оптимизация даст тебе скорее всего 1-2%. Кинь файлы на ночь на каком-нибудь дедике с ссд, да пусть обрабатываются. Не понимаю, к чему оптимизация, если это разовая обработка
     
  3. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Пример работы с файлами есть выше. Отсортировать можно с помощью утилиты sort (http://ru.wikipedia.org/wiki/Sort, версия под win32 - http://www.sendspace.com/file/z485i9).
    Если нужен готовый код, лучше обратиться в раздел "О работе".
     
  4. seregahowe

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

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    Всем здравствуйте. Господа, такой вопрос, возможно ли используя стандартный winsock в delphi, прикрутить SSL, чтоб работать с https ?

    Заранее всем спасибо за ответы
     
  5. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
  6. seregahowe

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

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    В delphi 3 не хочет компилироваться

    Пишет: undeclared identifier: 'sockaddr_in';

    Еще варианты есть кроме этого модуля?
     
    #9626 seregahowe, 6 Oct 2014
    Last edited: 6 Oct 2014
  7. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    Смысл использования delphi 3? Чем обусловлена такая жесткая привязанность? Ставь Delphi 7 и не знай горя
     
  8. seregahowe

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

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    Хотя бы размер ехе шника, который в 2 раза меньше.

    Еще вопросик, может не совсем по теме, как реализовать код, который выводит "топ паролей"?

    К примеру, на линуксе делается вот так:

    Code:
    cat 1.txt 2.txt 3.txt | sed -e 's/^[^:;]*[:;]//g' | sort | uniq -c | sort -nr | head -n 20
    
     252301 qwerty
     119868 123456
      32776 123456789
      16538 111111
      13761 12345
      12930 qwertyuiop
      12377 password
      11792 12345678
      10711 1qaz2wsx
      10198 1234567890
      10190 1234567
       8744 123123
       8411 123321
       8172 qazwsx
       8046 1q2w3e4r
       6514 7777777
       6303 qwer1234
       6251 000000
       6117 123qwe
       6055 1q2w3e4r5t
    Вопрос, как реализовать для винды?
     
    #9628 seregahowe, 6 Oct 2014
    Last edited: 6 Oct 2014
  9. KIR@PRO

    KIR@PRO from Exception

    Joined:
    26 Dec 2007
    Messages:
    826
    Likes Received:
    291
    Reputations:
    359
    Вариантов не много:
    1) Портировать все шесть прог под винду и юзать их в дальнейшем в такой же связке, с небольшим изменением в стиле вызова; (благо они все OpenSource)
    2) Писать код включающий функционал всех шести упомянутых прог
    3) писать узконаправленный код, конкретно под эту задачу (вывод топ паролей).
     
    _________________________
    1 person likes this.
  10. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    Если не ошибаюсь, тот же перл умеет здорово работать с регулярками, следовательно на нем все это сделать проще простого
     
    3 people like this.
  11. seregahowe

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

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    Подскажите, есть консольный многопоточный чекер аккаунтов http. Необходимо отображать прогресс выполнения "чека".

    Как реализовать "прогрессбар" в консольном варианте?

    Спасибо за помощь!


    И еще одно, извините за повтор, такие вопросы уже задавались, даже мне примеры приводили, но так ничего у меня и не получилось.

    Есть примерно следующий код:

    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
      StdCtrls, ComCtrls, Gauges, SyncObjs;
    
    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        UpDown1: TUpDown;
        Button1: TButton;
        Label1: TLabel;
        Label2: TLabel;
        OpenDialog1: TOpenDialog;
        GoodLabel: TLabel;
        BadLabel: TLabel;
        IdHTTP1: TIdHTTP;
        Gauge1: TGauge;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
     TNewThread = class(TThread)
      private
       FAcc : string;
       FPas : string;
       Rez : Integer;
      protected
        procedure Execute; override;
      public
        procedure Sync;
        constructor Create(CreateSuspended: Boolean);
      end;
    
    var
      Form1: TForm1;
      Accounts:Tstringlist;
      Thread, Acc:integer;
      Work:boolean;
      CS:TcriticalSection;
      GoodFile, BadFile: textfile;
    
    implementation
    
    {$R *.dfm}
    
    constructor TNewThread.Create(CreateSuspended: Boolean);
    begin
      inherited Create(CreateSuspended);
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     OpenDialog1.InitialDir:=ExtractFilePath(Application.ExeName);
     if OpenDialog1.Execute then
      begin
       Accounts.Clear;
       Accounts.LoadFromFile(OpenDialog1.FileName);
      end;
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
     Assignfile(GoodFile, ExtractFilePath(Application.ExeName)+'good.txt');
     Rewrite(GoodFile);
     Closefile(GoodFile);
     Assignfile(BadFile, ExtractFilePath(Application.ExeName)+'bad.txt');
     Rewrite(BadFile);
     Closefile(BadFile);
     GoodLabel.Caption:='0';
     BadLabel.Caption:='0';
     Gauge1.MaxValue:=Accounts.Count;
     Gauge1.Progress:=0;
     Acc:=-1;
     Work:=true;
     for Thread:=1  to strtoint(Edit1.Text) do
      TNewThread.Create(false);
     Thread:=strtoint(Edit1.Text);
    end;
    
    procedure TNewThread.Execute;
    var CurAcc:integer;
        data:Tstringlist;
        HTTP: TIdHTTP;
    begin
     while Work do
      begin
       CS.Enter;
       Inc(Acc);
       if Acc<Accounts.Count then CurAcc:=Acc else Work:=false;
       CS.Leave;
    
       if Work then
        begin
         FAcc:= Copy(Accounts[CurAcc],1,Pos(';',Accounts[CurAcc])-1);
         FPas:= Copy(Accounts[CurAcc],Pos(';',Accounts[CurAcc])+1,Length(Accounts[CurAcc]));
    
         data:=Tstringlist.create;
         data.Add('st.posted=set');
         data.Add('st.email='+FAcc);
         data.Add('st.password='+FPas);
         data.Add('st.fJS=enabled');
         data.Add('st.screenSize=1366 x 768');
         data.Add('st.flashVer=10.1.82');
         data.Add('button_go=Войти');
         HTTP:=TIdHTTP.create;
         HTTP.HandleRedirects:=false;
         try
          HTTP.Post('', data);
          Rez:=-1;
         except
          if Pos('Set-Cookie: JSESSIONID=', HTTP.Response.RawHeaders.Text)<>0 then
           Rez:=1
          else
           Rez:=0;
         end;
         HTTP.Free;
         data.Free;
    
         Synchronize(Sync);
        end;
      end;
    
     dec(Thread);
     if Thread=0 then ShowMessage('OK');
    end;
    
    procedure TNewThread.Sync;
    begin
     case Rez of
       0:begin
          Accounts.Add(FAcc+';'+FPas);
         end;
       1:begin
          Append(GoodFile);
          Writeln(GoodFile,FAcc+';'+FPas);
          Closefile(GoodFile);
          Form1.GoodLabel.Caption:=IntToStr(StrToInt(Form1.GoodLabel.Caption)+1);
          Form1.Gauge1.Progress:=Form1.Gauge1.Progress+1;
         end;
      -1:begin
          Append(BadFile);
          Writeln(BadFile,FAcc+';'+FPas);
          Closefile(BadFile);
          Form1.BadLabel.Caption:=IntToStr(StrToInt(Form1.BadLabel.Caption)+1);
          Form1.Gauge1.Progress:=Form1.Gauge1.Progress+1;
         end;
     end;
    end;
    
    
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
     Accounts.Free;
     CS.Free;
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     Accounts:=Tstringlist.create;
     CS:=TcriticalSection.create;
    end;
    
    end.
    
    Пользователь сам вводит количество потоков, при нажатии на кнопку потоки создаются и выполняют свою работу.

    Вопрос: Как это все реализовать через BeginThread или CreateThread?

    Еще раз спасибо!

    Какие-то конфликты в разных версиях delphi, один и тот же код стабильно работает построенный в delphi xe и вылетает с ошибкой в delphi 3, 7. Это нехорошо, т.к. на данном этапе для меня первоначально важен размер приложения. Получается так:

    delphi3 - 120kb
    delphi7 - 160kb
    delphi xe - 420kb!

    И это консольное приложение! ХЗ в чем причина, поэтому и прошу у вас помощи.

    ps: Применяю Synapse. В XE тоже выпало приложение, только после пойденных 10000 комбинаций..

    Кстати, а в чем преимущество BeginThread перед TThread? И есть ли это преимущество вообще?
     
    #9631 seregahowe, 10 Oct 2014
    Last edited: 11 Oct 2014
  12. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    На дельфях, прогресс-бар в консольном приложении можно сделать только полной очисткой консоли(заливка пробелами) и перерисовкой всего содержимого. Это очень уродский метод, который занимает слишком много процессорного времени и к тому же очень не красиво выглядит, поэтому просто пиши ход выполнения в заголовке окна SetConsoleTitle('Title').

    По поводу динамического создания потоков, почитай литературу, достаточно 1-2 статей, чтобы понять как оно работает.
    Вот тебе готовый кодес потоков, одного из моих старых проектов:
    PHP:
    type
      TMsgRecord 
    record
        ThreadID 
    Integer;
        
    startacc Integer;
        
    endacc   Integer;
      
    end;

    ThreadVar
      msgPtr 
    : ^TMsgRecord;

    var
      
    tid:DWORD;
      
    stopmessage:boolean;

    for 
    ti:=1 to threadmax do
    begin
    tParams
    [ti].ThreadID:=ti;
    tParams[ti].startacc:=lastacc;
    tParams[ti].endacc:=ti*celaya;
    lastacc:=ti*celaya+1;
    tThreads[ti] := BeginThread(nil,0,
     
    Addr(Brute),
     
    Addr(tParams[ti]),
     
    0tThreadID[ti]);
    inc(tCount);
    StatusBar1.Panels.Items[3].Text:='Threads: '+IntToStr(tCount);
    end;
    Это пример передачи параметров и вызова потоков, поэтому коментариев не будет.


    По поводу конфликтов XE и других, XE хранит строки в другой кодировке, так же отличается описание string и (p)char, поэтому при переносе проекта с/на XE всегда возникают проблемы.

    Далее размер. Нужно стараться писать чистый код, без использования VCL'овских структур и рантаймов. Первое, что нужно тебе сдлеать - это отказаться от модулей Sysutils, Messages, Dialogs и любых других, которые используют эти модули. Правильно написанное приложение, работающее с интернетом и потоками, имеющее графический интерфейс, занимает в среднем 20-30 кб (Delphi 7) без ручной оптимизации, если допиливать руками, размер можно снизить еще на 2-7кб.


    преимущество BeginThread перед TThread заключается в том, что ты не таскаешь за собой лишние структуры, из-за которых приложение неприлично раздувается, а работаешь напрямую с WinAPI.
     
    1 person likes this.
  13. seregahowe

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

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    Чуть бы подробнее насчет подобнее насчет потоков? Выше, в моем предыдущем посте, написан чекер через класс потока (TThread). Как без ошибок повторить тоже самое, только как у вас, через BeginThread? Спасибо! И еще, как вы пишете граф интерфейс? Через Api? Вызываете формы из какого-нибудь res-файла, заранее созданные в C++, или же MCK?

    Кстати, насчет прогресс-бара, есть же функции которые выводят текст в оплереденные координаты в консоли, либо функция, которая очищает текущую строку) Как выводить хотя бы процент выполнения?
     
    #9633 seregahowe, 11 Oct 2014
    Last edited: 11 Oct 2014
  14. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    inc - стандартная функция инкремента. tCount - общее количество потоков. Я не стал копипастить ненужные переменные, т.к. они не имеют отношения к созданию потока и передачи ему параметров.

    Как переписать твой код через BeginThread? Так я скинул пример же, разбирай! :)
    Для начала разберись в новой программе, как создаются потоки и как общаются с MainThread'ом, а потом уже подскажу по твоему коду, когда будут более конкретные вопросы.

    Графический интерфейс пишу на апи, без ресурсов. Динамически создаю все окна, их компоненты и обработчики, хотя на самом деле через ресурсы быстрее, но мне так нравится.
    А вообще, если пишу софт для себя, то либо вывожу все в консоли, либо вообще ничего не вывожу, ибо лень и ненужно :eek:

    Вот хороший пример http://www.delphibasics.ru/BeginThread.php
     
  15. seregahowe

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

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    Спасибо. С потоками вроде разобрался. Мы могли бы пообщаться по поводу интерфейса без VCL?

    Кстати, вот вопрос насущный, я работаю со списками через TStringList, а он тащит за собой Classes, вот с этим как справиться?
     
    #9635 seregahowe, 11 Oct 2014
    Last edited: 11 Oct 2014
  16. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    Вместо StringList'a
    PHP:
    array [1..10of string
    А интерфейс...что именно тебя интересует? Ты хочешь избавиться от консоли и прикрутить гуи?
     
  17. seregahowe

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

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    Можно попробывать прикрутить, если поможете

    Заменил на массив, убрал Classes, размер тот же exe остался) так что в принципе особого смысла наверное нет

    А вот насчет интерфейса оч интересная тема!

    Кстать, насчет потоков, вот в чем ошибка была, наверно

    Code:
      for Thread := 1 to a do
        tArray[Thread] := BeginThread(nil, 0, @Execute, nil, 0, tID[Thread]);
      CloseHandle(tID[Thread]);
    Раньше у меня не было CloseHandle(tID[Thread]);

    Так правильно?

    Еще вопрос, а возможно как то задать размер окна консоли? и/или запретить изменение размера?
     
    #9637 seregahowe, 11 Oct 2014
    Last edited: 12 Oct 2014
  18. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    C гуи помогу, только задавай конкретные вопросы.

    По поводу Classes и неизменившегося размера. Видимо какой-то из других твоих модулей, кроме Classes, использует громоздкий SysUtils. Что у тебя есть в Uses?

    PHP:
    CloseHandle(tID[Thread]);
    Совершенно неверный подход. Поток это не хэндл. По окончании всех действий в потоке, его нужно завершать через EndThread. И делается это не в цикле создания потоков, а в ThreadFunc потока.

    Размер окна консоли задается таким образом:
    PHP:
    uses
      windows
    ;

    var
      
    RectTSmallRect;
      
    CoordTCoord;
    begin
      Rect
    .Left := 1;
      
    Rect.Top := 1;
      
    Rect.Right := 180;
      
    Rect.Bottom := 60;
      
    Coord.:= Rect.Right Rect.Left;
      
    Coord.:= Rect.Bottom Rect.Top;
      
    SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), Coord);
      
    SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TrueRect);
    Запретить изменение размера можно через постоянный вызов MoveWindow
     
  19. seregahowe

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

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    CloseHandle(tID[Thread]);

    Действительно, он вообще не нужен))

    А насчет общего количества потоков, инкремента их и декремента, это вообще нужно? У меня вроде без них все работает..

    В том проекте, из которого я удалял Classes - httpsock, SyncObjs, Windows; Компилирую его в delphi 3, выходной файл - 55 kb

    Насчет GUI попозже, сейчас пока вроде особой нужды нет, да и консоль мне больше нравится, и от пользователя требуется только два действия - ввести количество потоков и нажать Enter)
     
    #9639 seregahowe, 12 Oct 2014
    Last edited: 12 Oct 2014
  20. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    SyncObjs тащит за собой sysutils и classes
     
Thread Status:
Not open for further replies.