[ 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. seregahowe

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

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    Забавно, а без этих модулей возможно как-нибудь реализовать? Без критических секций наверное не обойтись, или есть другие методы синхронизации в консольке?
     
  2. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    Можно обойтись вообще без единого модуля, переписав весь код самому, только тут уже встает вопрос целесообразности ;)
     
  3. seregahowe

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

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    Насчет syncobj нашел решение, без всяких затрат

    CriticalSection: TRTLCriticalSection;

    Теперь осталось самое главное - убрать Classes (замена TStringList на array of string, как ты сказал), пока не знаю каким образом..
     
  4. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    Покажи что делаешь со StringList, помогу переделать
     
  5. seregahowe

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

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    Accounts.LoadFromFile(OpenDialog1.FileName);

    ///
    Code:
    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;
    Грубо говоря это.
     
  6. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    В твоем случае ни StringList, ни array of string не нужен.
    PHP:
    var
    data:string;
    ...
    begin
    ...
    data:='st.posted=set'+#13#10+
            
    'st.email='+FAcc+#13#10+
            
    'st.password='+FPas+#13#10+
            
    'st.fJS=enabled+#13#10+
            '
    st.screenSize=1366x768'+#13#10+
            '
    st.flashVer=10.1.82'+#13#10+
            '
    button_go=Войти';
     
  7. seregahowe

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

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    ппц) Accounts.LoadFromFile(OpenDialog1.FileName); - загрузка списка аккаунтов вида acc;pass

    потом парсинг до разделителя и после
    передача их в запрос и т.п.
    как не нужно)

    И тот код с indy, а я либо через synapse, если с https, либо через сокеты)

    Code:
     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]));
     
    #9647 seregahowe, 12 Oct 2014
    Last edited: 12 Oct 2014
  8. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    Можно заменить на
    PHP:
    var
    f:textfile
    account
    :string;

    begin
    AssignFile
    (f,OpenDialog1.Filename);
    Reset(f);
    while 
    not EOF(f) do begin
    Readln
    (account,f);
    ...
    парсинг строки
    ...
    end;
     
  9. seregahowe

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

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    Не совсем понял, каким образом следить за номером строки, каким образом многопоточно обращаться к разным строкам и парсить значения? и т.п.(

    Кстать, это все в консольке делается)
     
    #9649 seregahowe, 12 Oct 2014
    Last edited: 12 Oct 2014
  10. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    А, ты строки в потоках парсишь и обрабатываешь...тогда
    PHP:
    var
    f:textfile
    accounts
    : array of string;
    i:integer;

    begin
    AssignFile
    (f,OpenDialog1.Filename);
    Reset(f);
    while 
    not EOF(f) do begin
    inc
    (i);
    readln(f);
    end;

    Reset(f);
    SetLength(accountsi);
    while 
    not EOF(f) do
    readln(f,accounts[i]);

    ...
    парсинг строки
    ...
    end;
     
  11. seregahowe

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

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    PHP:
     var 
    f:textfile 
    accounts
    : array of string
    i:integer

    begin 
    AssignFile
    (f,OpenDialog1.Filename); 
    Reset(f);  // открываем файл на чтение
    while not EOF(f) do begin // пока не достигнем конца файла
    inc(i);  // увеличиваем счетчик строк на 1
    readln(f);  // читаем открытый файл построчно
    end

    Reset(f);  // открываем файл на чтение
    SetLength(accountsi);  - // эта строка не компилируется, accounts - это же массив строк, кстати, его фиксированным придется задавать?
    while not EOF(f) do // пока не достигнут конец файла
    readln(f,accounts[i]);  // записываем открытый файл построчно в созданный массив

    ... 
    парсинг строки 
    ... 
    end;  

    как-то так?

    А зачем кстати, лишние строки?

    Разве не так?

    PHP:
    AssignFile(f'source.txt');
      
    Reset(f);
      while 
    not EOF(f) do begin
      inc
    (num);
      
    readln(f,accounts[num]);
      
    writeln(accounts[num]);
      
    end;
     
    #9651 seregahowe, 12 Oct 2014
    Last edited: 12 Oct 2014
  12. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    Первый цикл - считаешь количество учеток в файле
    Второй цикл - задаешь размер динамического массива, исходя из количества учеток.

    SetLength(accounts, Succ(i)); //Задание размера динамического массива
     
    1 person likes this.
  13. seregahowe

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

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    Лан, сделаю статический массив) Вроде все, теперь весит 41kb без сжатия, спасибо! ))

    Это на delphi 3 такой размер, а на delphi7 - 48kb :mad:

    Слушай, со статическим массивом, если ужать пакером, при запуске он занимает кучу места в памяти :mad: а с полным кодом который ты написал появляется ошибка access violation

    Написал, заменив SetLength(accounts,num); на SetLength(accounts,succ(num));

    теперь вообще стоит наместе, либо выводит только последнюю строку(

    Отдельно скомпилировал твой код, выдает Range check error

    PHP:
    program Project1;
    {
    $APPTYPE CONSOLE}

    uses
      SysUtils
    ;

    var
      
    ftextfile;
      
    accounts: array of string;
      
    iinteger;

    begin
      AssignFile
    (f'source.txt');
      
    Reset(f);
      while 
    not EOF(f) do begin
        inc
    (i);
        
    readln(f);
      
    end;
      
    Reset(f);
      
    SetLength(accountssucc(i));
      while 
    not EOF(f) do
        
    readln(faccounts[i]);
      
    Readln;
    end.
     
    #9653 seregahowe, 12 Oct 2014
    Last edited: 13 Oct 2014
  14. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    Писал в сонном виде с отключенным мозгом, а ты такую явную ошибку не заметил :)

    PHP:
     program Project1;
    {
    $APPTYPE CONSOLE}

    uses
      SysUtils
    ;

    var
      
    ftextfile;
      
    accounts: array of string;
      
    i,kinteger;

    begin
    i
    :=0;
      
    AssignFile(f'source.txt');
      
    Reset(f);
      while 
    not EOF(f) do begin
        inc
    (i);
        
    readln(f);
      
    end;

      
    Reset(f);
      
    SetLength(accountssucc(i));

      for 
    k:=0 to i do
        
    readln(faccounts[k]);
      
    Readln;
    end.
    По поводу пакера, не тот пакер используешь, раз он крашит и жрет много памяти
     
  15. seregahowe

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

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    Проверял на upx и nspack ) Думаю, это из-за массива строк в 10000000 :)
     
  16. seregahowe

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

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    Мда, одну прогу переделал, теперь со второй проблемы, которая на Synapse. Там TStringStream; используется(
     
  17. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    Зачем делать массив с 10000000 элементов? Я же тебе привел рабочий пример динамического массива.

    C TStringStream я никогда не работал, поэтому скорее всего подсказать не смогу.
     
  18. seregahowe

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

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    Не, эт я вчера пробовал) сейчас все норм) Спасибо, значит надо что-то думать насчет замены сетевой библы, либо как-то научить сокеты с SSL работать, https)
     
  19. seregahowe

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

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    Всем привет. А возможно убрать полосы прокрутки в консольном приложении? (и запретить изменение размера).
     
  20. Eich3

    Eich3 Member

    Joined:
    27 Jan 2013
    Messages:
    22
    Likes Received:
    7
    Reputations:
    5
    Да, возможно. Вот набросок на С:

    PHP:
    HWND hConsoleWindow GetConsoleWindow();
    // 1. отрубаем изменение размера консольного окна
    LONG wndStyle GetWindowLong(hConsoleWindowGWL_STYLE);        
    wndStyle &= ~WS_SIZEBOX;        
    ShowWindow(hConsoleWindowSW_HIDE);
    if (!
    SetWindowLong(hConsoleWindowGWL_STYLEwndStyle))
    {
        return 
    1;
    }    
        
    ShowWindow(hConsoleWindowSW_SHOW);
        
    // 2. убираем скроллинг
    ShowScrollBar(hConsoleWindowSB_BOTHfalse);
        
    // 3. помечаем клиенсткую область окна консоли невалидной, чтобы она перерисовалась
    // если этого не сделать, возможны глитчи :)
    RECT clientRect;
    GetClientRect(hConsoleWindow, &clientRect);
    InvalidateRect(hConsoleWindow, &clientRecttrue);
     
    1 person likes this.
Thread Status:
Not open for further replies.