[ Delphi / Pascal ] — начинающим: задаем вопросы

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by begin_end, 28 Apr 2015.

  1. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    Как начнешь САМ писать код и возникнут проблемы, так тебе и помогут. А пока можешь обратиться в раздел о работе ;-)
     
    binarymaster likes this.
  2. Artist666

    Artist666 Member

    Joined:
    24 Nov 2015
    Messages:
    100
    Likes Received:
    7
    Reputations:
    0
    Дак я же в самом начале написал, у кого есть. )
    Спасибо. )
     
  3. Artist666

    Artist666 Member

    Joined:
    24 Nov 2015
    Messages:
    100
    Likes Received:
    7
    Reputations:
    0
    П.с. Конченный хостинг, скачать невозможно, только рекламы насмотрелся...
     
  4. Artist666

    Artist666 Member

    Joined:
    24 Nov 2015
    Messages:
    100
    Likes Received:
    7
    Reputations:
    0
    Да, надо было сначала прочитать инструкцию от автора...
    Всё пропатчил и установил.
     
  5. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Здравствуйте, как в многопоточном приложении работать с двумя или тремя разными открываемыми файлами

    PHP:
    var
    loginspass,hosts:Tstringlist;
    ...
    while 
    work do begin
        CS
    .Enter;
        
    Inc(int);
        if 
    int<pass.Count then intpass:=Int else Work:=False;
    ...
    http.host:=host[hst];
    http.login:=logins[log];
    http.Password:=pass[intpass];

    Например так с одним, а если например открываем отдельно логин, отдельно пароль и отдельно хост то как ? Вроде бы в потоке нельзя цикл for чтобы инициализировать переменную ?
     
    #286 triblekill, 12 Oct 2017
    Last edited: 12 Oct 2017
  6. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    Не совсем понял, в чем состоит вопрос. У тебя в 3 разных файлах содержатся хосты, логины и пароли и тебе нужно их синхронизировать 1-1-1 или 1-все-все? У тебя брут или чекер?
     
  7. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Брут, а синхронизировать нужно все-все-все то есть я выбираю каждым файлом отдельно логины, отдельно пароли и отдельно хосты помоги если чем сможешь
     
  8. Artist666

    Artist666 Member

    Joined:
    24 Nov 2015
    Messages:
    100
    Likes Received:
    7
    Reputations:
    0
    Delphi. Внутренняя ошибка F2084

    Устанавливаю компонент.

    SpTBXLib_d14.dpk
    Собрал, скомпилировал - всё ок(исправил кучу ошибок сначала).

    Начинаю собирать:
    SpTBXLibDsgn_d14.dpk

    Вылезает 1 ошибка:
    [DCC Fatal Error] SpTBXReg.pas(42): F2084 Internal Error: U2186

    Из SpTBXReg.pas - 5я строка, начиная с SpTBXItem:
    Code:
    uses
      Windows, Classes, Controls, SysUtils, Graphics, ImgList, Dialogs,
      DesignIntf, DesignEditors, VCLEditors, TB2Reg,
      TB2Toolbar, TB2Item, TB2DsgnItemEditor,
      SpTBXItem, SpTBXTabs, SpTBXDkPanels, SpTBXFormPopupMenu, SpTBXControls,
      SpTBXEditors, SpTBXExtEditors, SpTBXPageScroller, SpTBXCustomizer, SpTBXMDIMRU;
    
    Эти классы(файлы *.res) в папке sourse лежат.

    И они прописаны в файле SpTBXLib_d14.dpk(который я успешно собрал и скомпилил перед этим):
    Code:
    contains
      SpTBXItem in '..\Source\SpTBXItem.pas',
      SpTBXControls in '..\Source\SpTBXControls.pas',
      SpTBXTabs in '..\Source\SpTBXTabs.pas',
      SpTBXDkPanels in '..\Source\SpTBXDkPanels.pas',
      SpTBXEditors in '..\Source\SpTBXEditors.pas',
      SpTBXExtEditors in '..\Source\SpTBXExtEditors.pas',
      SpTBXColorPickerForm in '..\Source\SpTBXColorPickerForm.pas',
      SpTBXMDIMRU in '..\Source\SpTBXMDIMRU.pas',
      SpTBXFormPopupMenu in '..\Source\SpTBXFormPopupMenu.pas',
      SpTBXCustomizer in '..\Source\SpTBXCustomizer.pas',
      SpTBXCustomizerForm in '..\Source\SpTBXCustomizerForm.pas',
      SpTBXPageScroller in '..\Source\SpTBXPageScroller.pas',
      SpTBXSkins in '..\Source\SpTBXSkins.pas',
      SpTBXDefaultSkins in '..\Source\SpTBXDefaultSkins.pas';
    Читал, что в конце такой ошибки зашифровано имя файла и ошибка - U2186.
    Как его расшифровать?

    [​IMG]
     
  9. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    Ну это же обычная математика. Алгоритм простой: допустим у тебя по 5 строк в каждом файле, 5*5*5 = 125 комбинаций в общем, 125 делишь на количество потоков-1 и в одном потоке запускаешь остатки, в случае если общее число комбинаций не делится нацело. Если взять в расчет то, что какой-то потом быстрее остальных переберет свою часть и ты хочешь распределить на него нагрузку с еще непроверенных данных, то алгоритм будет немного сложнее и для простоты решения задачи, удобнее будет формировать единый список из всех файлов, а затем его обрабатывать в потоках. Если в голове сложно составить весь алгоритм, то моешь по-старинке, нарисовать на бумаге и исходя из него уже кодить)
     
  10. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    Компиль компоненты без оптимизации и устанавливай пакеты заново, говорят помогает. Project -> Options -> Compiler -> Code generation -> x Optimization
     
    Artist666 likes this.
  11. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Всё таки не понимаю до конца как условие правильно поставить например если с одним то Inc(pass) повышаем пароли на 1 каждый раз, а вот с несколькими как ? Можешь помочь примером хотя бы с двумя как делается лучше ?
     
    #292 triblekill, 13 Oct 2017
    Last edited: 13 Oct 2017
  12. Artist666

    Artist666 Member

    Joined:
    24 Nov 2015
    Messages:
    100
    Likes Received:
    7
    Reputations:
    0
    Всё, нашел косяк, либу переименовал, а тут в дпк старое имя стояло. ))
    Скомпилил.

    Остался 1 компонент из 11, ровно 2 недели уже устанавливаю их. :D

    Кто знает, как так происходит?
    Я меняю типы у функции в её объявлении, а в других файлах она как упоротая со старыми остаётся, да ещё и орёт: E2033 Types of actual and formal var parameters must be identical.

    Функция объявляется в sciUtils.pas(Открыл в notepad++ все файлы компонента и поиском только тут выдало):

    Вверху:
    Code:
    //Возвращает строку перед разделителем 'separator' и задает остальную часть строки в 'S'.
    function WordBefore(var S: AnsiString; const Separator: AnsiChar): AnsiString;
    И потом ниже:
    Code:
    //Извлекает строку от начала до 'separator'. Возвращает это значение и задает остальную часть строки в 's'
    function WordBefore(var S: AnsiString; const Separator: AnsiChar): AnsiString;
    var
      I: Integer;
    begin
      I := Pos(Separator, S);
      if I <> 0 then
      begin
        Result := Copy(S, 1, I - 1);
        Delete(S, 1, I);
      end else
      begin
        Result := S;
        S := '';
      end;
    end;
    Значит я меняю и тут и там AnsiString на WideString, AnsiChar на WideChar.
    Сохранил. И закрыл/открыл проект. И RAD перезапустил. И "clear" жал в Project Manager на dpk.
    И всё равно эта скотина мне говорит, что там Ansi.

    [​IMG]
     
    #293 Artist666, 13 Oct 2017
    Last edited: 13 Oct 2017
  13. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Почему ловлю Access violation address ?

    Code:
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      Work:=True;
      for Thread:=0 to 50 do
      begin
        th.Create(false);
      end;
      end;
    
    
    procedure th.Execute;
    var
    str:string;
    UDP:TUDPBlockSocket;
    begin
      while work do begin
        CS.Enter;
        end;
        Cs.Leave;
        if work then begin
        UDP:=TUDPBlockSocket.Create;
        UDP.Connect(ip,port);
        UDP.SendString('Sonic');
       end;
     
  14. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    Мало данных, возможно бьются какие-то указатели. У тебя очень извращенский метод работы с потоками через критические секции. Посмотри скомпиленый семпл под отладчиком и узнаешь
     
    binarymaster likes this.
  15. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    А ты бы хотел чтобы больше данных было ?
     
  16. binarymaster

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

    Joined:
    11 Dec 2010
    Messages:
    4,717
    Likes Received:
    10,195
    Reputations:
    126
    Чтобы меньше извращений было, и больше понимания кода.

    Только вот как этого добиться...
     
    #colorblind likes this.
  17. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Пишу маленький брут FTP

    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Graphics, Forms, syncobjs,
      Dialogs, StdCtrls, Controls, Classes, FTPSend;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        Button2: TButton;
        Button3: TButton;
        OpenDialog1: TOpenDialog;
        Edit1: TEdit;
        Edit2: TEdit;
        Button4: TButton;
        Label1: TLabel;
        Edit3: TEdit;
        Memo2: TMemo;
        Label2: TLabel;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    type th = class(TThread)
      private
        rez: integer;
      public
        ftp: tftpsend;
        procedure sync;
      protected
        procedure Execute; Override;
    end;
    
    var
      Form1: TForm1;
      logins,pass: tstringlist;
      log, pas, proxy: integer;
      work: boolean;
      cs: tcriticalsection;
      good: textfile;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    if opendialog1.Execute then
    begin
      logins.Clear;
      logins.LoadFromFile(opendialog1.FileName);
    end;
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    var
    Thread:integer;
    begin
    if (pass.Count<>0) and (logins.count<>0) then
    begin
      Work:=True;
      for Thread:=0 to strtoint(Edit3.text) do
        th.Create(false);
      end;
    end;
    
    procedure th.Execute;
    begin
      while work do begin
      CS.Enter;
    
      if pas=pass.count-1 then begin
        inc(log);
        pas:=proxy;
        end;
        if log=logins.Count-1 then work:=false;
        Inc(pas);
        Cs.Leave;
    
        if work then begin
            ftp:=tftpsend.Create;
            FTP.TargetHost:=form1.Edit1.text;
            FTP.TargetPort:=form1.Edit2.text;
            FTP.UserName:=logins[log];
            FTP.Password:=pass[pas];
    
          if FTP.Login then begin
            rez:=1;
          end
          else begin Rez:=-1;
          end;
          ftp.Free;
          Synchronize(Sync);
        end
    end;
        end;
    
    
    
    
    procedure th.sync;
    var
    i:integer;
    begin
      case rez of
        1:begin
          Form1.Memo2.Lines.Add(logins[log]+':'+pass[pas]);
          i:=0;
          inc(i);
          Form1.Label2.caption:=inttostr(i);
          Form1.Memo2.Lines.SaveToFile(ExtractFilePath('GOOD.txt'));
    
    
        end;
        -1:begin
          Form1.Memo1.Lines.Add(logins[log]+':'+pass[pas]+'  Login incorrect.')
        end;
      end;
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    logins:=tstringlist.Create;
    pass:=tstringlist.Create;
    cs:=tcriticalsection.Create;
    end;
    
    procedure TForm1.Button4Click(Sender: TObject);
    begin
    if opendialog1.Execute then
    begin
      pass.Clear;
      pass.LoadFromFile(opendialog1.FileName);
    end;
       end;
    
    procedure TForm1.Button3Click(Sender: TObject);
    begin
    work:=false;
    end;
    
    end.
    Понять не могу то пропускает некоторые пароли из файла то перебираются по 2 одинаковых пароля
     
  18. DartPhoenix

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

    Joined:
    15 Sep 2013
    Messages:
    1,105
    Likes Received:
    8,474
    Reputations:
    25
    Кодес не читал. Там что-то страшное...
    Вот какая штука: тебе нужно брать записи из memo разными потоками ?
    Значит проще всего сделать соответствующее свойство при чтении из списка в котором

    ===========================
    * производить блокировку списка
    * сохранение прочитанного в Result
    * удаление прочитанного элемента
    * разблокировку списка
    ===========================

    И читать из любого угодного тебе треда.
    Тогда вопрос "почему читаются два одинаковых" уже стоять не будет.
    Будет стоять вопрос почему один и тот же поток два раза выполняется... если вообще будет ошибка.

    Пытаться заставить заработать текущий кодес ИМХО ведет к закреплению собцтвенной ошибки и развитию плохого стиля.
     
  19. spiner

    spiner Member

    Joined:
    8 Jul 2015
    Messages:
    74
    Likes Received:
    56
    Reputations:
    4
    То, что бросается сразу в глаза:
    1. Переменную pas (которая, как я понял содержит в себе номер текущего пароля в списке) надо бы сделать локальной для потока и внутри TThread.Execute перебирать циклом каждый пароль к отдельно взятому логину.
    2. Что за переменная proxy и где происходит её инициализация? Это может сыграть злую шутку в случае, если программа зарезервирует под неё неосвобожденную область в памяти: например, там будет храниться число 5000, а у тебя паролей всего 300 в файле - поток упадет при попытке взять с TStringList значение под индексом 5000.