Конференция "Начинающим" » Еще один вопрос по потокам [D2005]
 
  • fics © (10.04.17 10:51) [20]

    > kilkennycat ©   (10.04.17 09:16) [16]

    Так у меня полной пересканировки и нет при вводе обычных символов. Она запускается только при вводе кавычек и комментария и то с места их ввода и до конца
  • fics © (10.04.17 11:03) [21]

    > Leonid Troyanovsky ©   (10.04.17 09:50) [17]


    > sniknik ©   (10.04.17 10:10) [18]

    Буду колдовать с таймером.
    Было что-то типа:
    Scan;
    begin
     n := 1;
     while n <> Length(Text) do begin
       {-----}
       inc(n)
     end;
    end;


    А теперь что-то из этого мудрить нужно
  • NoUser © (10.04.17 11:48) [22]
    while n <> Length(Text) do begin
      if ( fNewText ) then Break;
      {-----}  
      inc(n)
    end;

  • fics © (10.04.17 15:35) [23]

    > NoUser ©   (10.04.17 11:48) [22]
    >
    > while n <> Length(Text) do begin
    >   if ( fNewText ) then Break;
    >   {-----}  
    >   inc(n)
    > end;

    Ну без задержки таймером все равно не получиться, так как и fNewText
    и вызов Scan идут с одной точки, оборвать так конечно можно, но нужно как-то ждать выхода из функции. Без таймера тут не обойтись, так как:

    unit Unit1;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, StdCtrls;

    type
     TForm1 = class(TForm)
       Label1: TLabel;
       Label2: TLabel;
       procedure FormKeyPress(Sender: TObject; var Key: Char);
       procedure FormActivate(Sender: TObject);
     private
       { Private declarations }
     public
       SyspendFlag: Boolean;
       function Scan: Boolean;
     end;

    var
     Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.FormActivate(Sender: TObject);
    begin
     SyspendFlag := False;
     Scan;
    end;

    function TForm1.Scan: Boolean;
    var
     n: Integer;
    begin
     n := 0;
     while  n < 214748364 do begin
       if SyspendFlag then begin
         Label2.Caption := IntToStr(n);   {тут всегда будет ноль}
         Break;
       end;
       Inc(n);
       Application.ProcessMessages;
     end;

     SyspendFlag := False;
    end;

    procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
    begin
     SyspendFlag := True;
     Label1.Caption := Key;
     Scan;
    end;
  • NoUser © (10.04.17 17:01) [24]
    type
     TForm1 = class(TForm)
       Memo1: TMemo;
       Label1: TLabel;
       procedure Memo1KeyPress(Sender: TObject; var Key: Char);
       procedure FormClose(Sender: TObject; var Action: TCloseAction);
     private
       fInScan :Boolean;
       fReScan :Boolean;
       fBrScan :Boolean;
       function Scan: Boolean;
       procedure WmUser100(var Msg:TMessage); message WM_USER+1;
     end;
    var
     Form1: TForm1;

    implementation

    {$R *.dfm}

    function TForm1.Scan: Boolean;
    var
     n: Integer;
    begin
     fInScan := True;
     fBrScan := False;
     n := 0;
     while  n < 214748364 do begin
       if (fReScan) then begin
         fReScan := False;
         Memo1.Lines.Add(IntToStr(n));
         n := 0;
       end;
       if (fBrScan)
         then Break;
       Inc(n);
       Application.ProcessMessages;
     end;
     fInScan := False;
    end;

    procedure TForm1.WmUser100(var Msg: TMessage);
    begin
    if ( fInScan )
      then fReScan := True
      else Scan;
    end;

    procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
    begin
    PostMessage(Handle, WM_USER+1,0,0);
    end;

    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    fBrScan := True;
    end;
  • fics © (10.04.17 19:22) [25]

    > NoUser ©   (10.04.17 17:01) [24]

    Ну концептуально примерно правильно, но где fBrScan становится истинным, кроме как при закрытии формы?
    Ведь нужно же обрывать цикл при новом вводе, а выход только по
    if (fBrScan) then Break;



    И это не правильная логика, если Scan будет успевать дорабатывать до конца, то нового Скана не будет

    procedure TForm1.WmUser100(var Msg: TMessage);
    begin
    if ( fInScan )
      then fReScan := True
      else Scan;
    end;
  • fics © (10.04.17 20:26) [26]
    точнее при первом нажатии клавиши мы оборвем предыдущий цикл, а новый не начнем.

    правильнее наверное будет так:   (но только наверное ) нужно потестировать

    function TForm1.Scan: Boolean;
    var
     n: Integer;
    begin
     fInScan := True;
     n := 0;
     while  n < 214748364 do begin
       if (fReScan) then begin
         fReScan := False;
         Scan; {вызов после прекращения предыдущего}
         Break;
       end;
       Inc(n);
       Application.ProcessMessages;
     end;

     fInScan := False;
    end;
  • NoUser © (11.04.17 02:03) [27]

    > Ведь нужно же обрывать цикл при новом вводе,

    Зачем обрывать если можно сказать сканируй заново ?
    (ну, и подсунь данные, которые нужны для нового скана)

    А обрывать, это если юзеру уже нужно новый документ или винда пошла обновляться. ))


    > если Scan будет успевать дорабатывать до конца, то нового Скана не будет

    отлично, значит успели просканить до ввода нового символа - как и задумано!
 
Конференция "Начинающим" » Еще один вопрос по потокам [D2005]
Есть новые Нет новых   [118606   +35][b:0][p:0.001]