[ 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:
    637
    Likes Received:
    246
    Reputations:
    42
    #261 #colorblind, 12 Apr 2017
    Last edited: 12 Apr 2017
  2. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Не понимаю всё же там сказано A2A_PING Ping

    Code:
    отправляем 
    FF FF FF FF 69 ÿÿÿÿi
    
    получаем 
    FF FF FF FF 6A 00 ÿÿÿÿj.
    
    И что тут есть пинг ?
     
  3. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    Дико извиняюсь, я тебя сбил. Действительно, этот пинг используется лишь для того, чтобы узнать, жив ли сервер, а не как нормальный пинг), но оформить в виде функции все-таки стоит. А потом сделать примерно так:
    PHP:
    var
    Freqbeforeafter TLargeInteger;
    Elapsedstring;
    i:integer;

    begin
    QueryPerformanceFrequency
    (Freq);
    QueryPerformanceCounter(before);

    Ping_CS_Goldserver(hostport);

    QueryPerformanceCounter(after);
    Elapsed:= FormatFloat('0.0000', (after before) / Freq) + ' sec';
     
  4. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Ничего страшного только скажи я правильно думаю ?

    Code:
    UDP.Connect('192.168.1.1','7777');
    udp.SendString(Hextostr('FFBB4502B'));
    QueryPerformanceCounter(before);
    udp.RecvString(100);
    QueryPerformanceCounter(after);
    Elapsed:= FormatFloat('0.0000', (after - before) / Freq) + ' sec';
    Memo1.lines.add(Elapsed);
    
    Тогда по сути Gettickcount тоже показывает, но только не верно показатели напрямую зависят от значения udp.RecvString(1000);
     
  5. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    Да, все верно. А значения у тебя не верные из-за большого таймаута при получении ответа. Думаю нужно засекать пинг именно с поправкой на него
     
    #265 #colorblind, 12 Apr 2017
    Last edited: 13 Apr 2017
  6. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Подскажите пожалуйста как использовать Isaac.pas
    Code:
    uses Isaac;
    
    label1.caption:=Isaac(99)?????
    
     
  7. binarymaster

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

    Joined:
    11 Dec 2010
    Messages:
    4,717
    Likes Received:
    10,195
    Reputations:
    126
  8. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
  9. binarymaster

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

    Joined:
    11 Dec 2010
    Messages:
    4,717
    Likes Received:
    10,195
    Reputations:
    126
    Так там же всё расписано:
    PHP:
    // Usage example:

       
    var
           
    iinteger;
           
    xTIsaac;
       
    begin
            x
    .Create;
            for 
    i:=1 to 20 do Memo1.Lines.Add(IntToHex(x.val8));
            
    x.reSeed;  // reseed exactly as in Create()
            
    for i:=1 to 20 do Memo1.Lines.Add(IntToHex(x.val8));  // get the same values

       
    end;
     
    triblekill likes this.
  10. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Блин теперь ошибка в самом модуле ругается на for i:= 0 to 255 do mem:=0;
     
  11. WallHack

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

    Joined:
    18 Jul 2013
    Messages:
    306
    Likes Received:
    138
    Reputations:
    33
    Везде примеры как открыть один файл в папки, есть примеры как работать со всеми файлами в определенной папки последовательно ?
     
  12. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    TSearchRec, FindFirst, FindNext
     
  13. Protocoler

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

    Joined:
    10 Oct 2012
    Messages:
    51
    Likes Received:
    54
    Reputations:
    81
    Подскажите пожалуйста.. Никак не могу разобраться по многопоточности. Цель - запустить 10 потоков, если один закончил работу, создается новый. У меня почему-то зависает софтина.. При маленьком количестве входного материала, все работает, с увеличением входного материала, все больше начинает подвисать после старта..

    P.S. По поводу подвисаний понял:
    Я создаю потоки от 1 до 10. Каждый поток увеличивает и уменьшает ' J ' по старту и концу..
    Как мне отследить какой конкретно поток завершился ( под каким индексом ) , чтобы создать его снова ??

    Я попробовал несколько вариантов ( работает, но все равно виснет на каком-то из потоков ), один из :

    Код


    Code:
    Tmythread = class(Tthread)
    
    private
    finish : integer;
    
    
    procedure TForm1.Button3Click(Sender: TObject);
    var
    i,x : integer;
    begin
    progressbar1.Max:=source.Count-1;
    i:=0;
    j:=1;
    setlength(thread,10);
    setlength(check,10);
    check[1]:=0;
    check[2]:=0;
    check[3]:=0;
    check[4]:=0;
    check[5]:=0;
    check[6]:=0;
    check[7]:=0;
    check[8]:=0;
    check[9]:=0;
    check[10]:=0;
    critical:=Tcriticalsection.Create;
    
    while i<source.Count-1 do
    begin // i
    
    //  begin //jj
    if j+1<10 then
    begin //j
    
    for x:=0 to length(check) do
    begin  // xx
    if check[x]=0 then
    begin
    check[x]:=1;
    thread[x]:=Tmythread.Create(true);
    thread[x].FreeOnTerminate:=true;
    thread[x].Flink:=source;
    thread[x].finish:=x;
    thread[x].Resume;
    inc(i);
    end;
    
    end; // xx
    end;  // j
    
    end; //jj
    end;
    
    
    
    Execute ();
    begin
    
    try
    inc(j);
    check[finish]:=0;
    finally
    critical.Leave;
    end;
    
    end;
    И вообще, если я ставлю как счетчик, вывод i / j в лейбл в основном потоке, то ничерта не выводится, только в мемо.. А если я ставлю showmessage при exception, допустим если j=10 , то после вылета окна и нажатия кнопки окей, зависона не происходит и программа дорабатывает все до конца. Такой же трюк со sleep не проходит. Все равно зависает намертво. И вообще, как может быть j=10 , если он увеличивается, только если if j+1<10 !!! Я ничего не понимаю (


    Буду очень благодарен за объяснение. Спасибо.

    Основной код :
    Код


    Code:
    unit Unit1;
    
    interface
    
    uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, httpSend, Vcl.ComCtrls, SyncObjs, ssl_openssl;
    
    type
    TForm1 = class(TForm)
       Memo1: TMemo;
       OpenDialog1: TOpenDialog;
       SaveDialog1: TSaveDialog;
       Button1: TButton;
       Button2: TButton;
       Button3: TButton;
       ProgressBar1: TProgressBar;
       Label1: TLabel;
       procedure Button1Click(Sender: TObject);
       procedure Button2Click(Sender: TObject);
       procedure Button3Click(Sender: TObject);
    private
       { Private declarations }
    public
       { Public declarations }
    end;
    
       Tmythread = class(Tthread)
    
    private
    Flink : string;
    procedure results;
    procedure show;
    protected
    procedure Execute; override;
    public
    // constructor Create(CreateSuspended: Boolean);
    end;
    
    
    
    var
    Form1: TForm1;
    source ,res : Tstringlist;
    thread : array of Tmythread;
    critical : TCriticalSection;
    j : integer;
    
    implementation
    
    {$R *.dfm}
    
    //constructor Tmythread.Create(CreateSuspended: Boolean);
    //begin
    //  inherited Create(CreateSuspended);
    //end;
    
    
    
    procedure Tmythread.show;
    begin
    form1.progressbar1.Position:=form1.progressbar1.position+1;
    end;
    
    
    procedure Tmythread.results;
    begin
    res.Add(Flink);
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    source := Tstringlist.create;
    res :=Tstringlist.Create;
    
    if OpenDialog1.Execute then
    begin
      source.LoadFromFile(OpenDialog1.FileName);
    end;
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    if SaveDialog1.Execute then
    begin
    res.SaveToFile(SaveDialog1.FileName);
    end;
    end;
    
    procedure TForm1.Button3Click(Sender: TObject);
    var
    i : integer;
    begin
    progressbar1.Max:=source.Count-1;
    i:=0;
    j:=1;
    setlength(thread,10);
    critical:=Tcriticalsection.Create;
    
    while i<source.Count-1 do
    begin // i
    
    if j+1<10 then
    begin //j
    
    if j=1 then
    begin
    
    thread[j]:=Tmythread.Create(true);
    thread[j].FreeOnTerminate:=true;
    thread[j].Flink:=source;
    thread[j].Resume;
    inc(i);
    end
    else
    begin
    thread[j+1]:=Tmythread.Create(true);
    thread[j+1].FreeOnTerminate:=true;
    thread[j+1].Flink:=source;
    thread[j+1].Resume;
    inc(i);
    end;
    
    end; //j
    
    end; // i
    
    end;
    
    
    procedure Tmythread.Execute;
    var
    http: ThttpSend;
    www : string;
    code : Tstringlist;
    des,key : string;
    check : boolean;
    k : integer;
    begin
    critical.Enter;
    inc(j);
    //inc(x);
    critical.Leave;
    code:=TstringList.Create;
    http:=ThttpSend.Create;
    www:='lalalalala'
    
    try  // try
    
    
    
    
    try // =
    http.Document.Clear;
      http.httpmethod('GET','http://'+www);
    except  // =
    on E:exception do
    begin
    
    end;
    
    end;  // =
    
    
    
    
      if http.ResultCode=200 then
      begin // code
      code.LoadFromStream(http.Document);
      des:=Copy(копирование);
    
      des:=Copy(des,0,pos('"',des)-1);
    
    
      key:=Copy(копирование);
    
    
    
      for k := 0 to form1.Memo1.Lines.count-1 do
      begin  // for k
    
      if ((pos(form1.Memo1.Lines[k],des)>0) or  (pos(form1.Memo1.Lines[k],key)>0)) then
      begin
      critical.Enter;
      results;
      critical.Leave;
    
      end;  // for k
    
    
    
    
    
      end;
    
    
    
    
      end;  // code
    finally  // try
    sleep(1000);
    synchronize(show);
    critical.Enter;
    dec(j);
    critical.Leave;
    code.Free;
    http.Free;
    end;  // try
    
    
    end;
    
    end.



    Долго рывшись в гугле нашел инфу для себя глупого :
    Пишет ( HiredKiller )
    Цитата

    Ну окей. Вывел в главный поток таким образом. Все равно подвисает.. Как же быть то ?

    И так виснет.

    application.ProcessMessages;
    form1.progressbar1.Position:=form1.progressbar1.position+1;


    И так виснет.
    if i=form1.progressbar1.Position+30 then
    begin
    form1.progressbar1.Position:=i;
    end;

    if i=source.count-1 then
    begin
    form1.progressbar1.Position:=form1.progressbar1.max;
    end;
     
  14. r1ddl3

    r1ddl3 New Member

    Joined:
    31 Aug 2017
    Messages:
    12
    Likes Received:
    2
    Reputations:
    0
    бегло просмотрел код, нельзя обращаться из потока к компонентам формы, разве что только из метода synchronize.
     
  15. Protocoler

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

    Joined:
    10 Oct 2012
    Messages:
    51
    Likes Received:
    54
    Reputations:
    81
    Возможно я не прав, но на сколько я знаю чтение разрешается. Я же не меняю содержимое. Ну хорошо. Но проблема не в этом, даже закомментировав весь этот блок проблема остается.

    На другом борде получил такой ответ :
    Не буду сюда копировать мои множественные попытки это сделать, все равно ничего не вышло.

    Помогите мне реализовать маленький код на основе моей задачи:
    Задавать список для обработки, чтобы 10 потоков обработали этот список. Как правильно приостановить поток, передать ему новый параметр для обработки и запустить снова ??
     
  16. r1ddl3

    r1ddl3 New Member

    Joined:
    31 Aug 2017
    Messages:
    12
    Likes Received:
    2
    Reputations:
    0
    1 строка для 1 потока ?
    Вариант 1: Создать главный поток, который будет создавать дополнительные потоки посылая им новую строку, дополнительный поток после обработки строки завершается, сообщая об этом главному потоку. Тот смотрит, есть ли еще данные для обработки, и если есть, запускает новый поток
    Вариант 2 : Заранее создать 10 потоков и там сделать нечто подобное :


    1. while GetLine() do
      begin
      ......
      end
     
  17. Matrix001

    Matrix001 Active Member

    Joined:
    18 Aug 2016
    Messages:
    262
    Likes Received:
    146
    Reputations:
    3
    Помогите составить код .
    Вывести на печать таблицу n значений функции y = ax + b ⋅ x + c 2 при изменении х от х1 до х2 с шагом h = (х2- х1)/n. Коэффициенты a, b, c, границы интервала х1, х2 и число n ввести с 7 клавиатуры. По таблице значений определить участки, содержащие корни уравнения, а также максимальное и минимальное значение функции. а = -1,14; b = -4,21; с = 3,25; x1=-2; x2=2; n=25.
    Заранее спасибо.
     
  18. Artist666

    Artist666 Member

    Joined:
    24 Nov 2015
    Messages:
    100
    Likes Received:
    7
    Reputations:
    0
    У кого есть компоненты tb2k 2.2 и TBX 2.2?

    Уже сил нет с этими придурошными компонентами.
    Неделю установить не могу(эти 2 последние остались).

    Их нужно пропатчить, а патч не работает нифига(тупо добавить в исходники должен код).
    И из-за этого у меня TBX не компилится.
     
  19. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    Прими наши соболезнования. А теперь по-твоему мы должны залезть в гугл и искать те же самые файлы, что и у тебя?)
    -
    крч я даже не поленился пострадать этой херней с компонентами, вот пропатченые, если надо: http://fileshare.link/aed06b00daba7aaa/tb2k-2.2.2_p.rar
    [​IMG]
    -
    btw, ставил компоненты в 7 дельфю, под 10 виндой. все встало с первого раза, как надо
     
    #279 #colorblind, 9 Oct 2017
    Last edited: 9 Oct 2017
    Artist666 likes this.
  20. Matrix001

    Matrix001 Active Member

    Joined:
    18 Aug 2016
    Messages:
    262
    Likes Received:
    146
    Reputations:
    3
    Помогите хоть кто-то из ГУРУ составить код программы для Pascal ABC NET.
    ----------------------------------------------------------------------------------

    Вывести на печать таблицу n значений функции y = ax2 + b ⋅ x + c при изменении х от х1 до х2
    с шагом h = (х2- х1)/n. Коэффициенты a, b, c, границы интервала х1, х2 и число n ввести с
    клавиатуры. По таблице значений определить участки, содержащие корни уравнения, а также
    максимальное и минимальное значение функции. а = -1,14; b = -4,21; с = 3,25; x1=-2; x2=2;
    n=25.