Конференция "Начинающим" » перезапуск функции [D7]
 
  • kashey (10.12.17 20:05) [0]
    Поясню вопрос сразу кодом. Помогите с правильным примером кода.
    Всю равно вызовы накапливаюся.

    unit Unit1;

    interface

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

    type
     TForm1 = class(TForm)
       procedure FormKeyPress(Sender: TObject; var Key: Char);
       procedure FormCreate(Sender: TObject);
     private
       { Private declarations }
     public
       procedure MyFunc;
     end;

    var
     Form1: TForm1;
     n: Integer;
     InFunc, SyspenpdFunc: Boolean;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    begin
     InFunc := False;
     SyspenpdFunc := False;
    end;

    procedure TForm1.MyFunc;
    begin
     InFunc := True;
     while n < 100000 do begin
       if SyspenpdFunc then Break;

       Caption := IntToStr(n);
       Inc(n);
       Application.ProcessMessages;
     end;
     InFunc := False;
    end;

    procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
    begin
     n := 0;
     if InFunc then SyspenpdFunc := True;
     while InFunc do begin end;

     SyspenpdFunc := False;
     MyFunc;
    end;

    end.

  • kilkennycat © (10.12.17 21:37) [1]
  • kashey (10.12.17 22:10) [2]
    А потоки здесь при чем?
  • rrrrrr © (10.12.17 22:28) [3]
    они хорошо помогают в случае если не удается выстрелить себе в ногу, но очень хочется.
    как в описанном выше случае.
  • kilkennycat © (10.12.17 22:46) [4]

    > rrrrrr ©   (10.12.17 22:28) [3]

    отлично сказал )
  • kashey (10.12.17 22:52) [5]
    т.е. без потока не получится? Ну наверняка же как-то можно?

    Ну вот приведу пример редактора с подсветкой кода, где после каждого нажатия клавиши нужно сканировать текст, но текст может быть очень большой и нужно оборвать предыдущее сканирование и начать новое.
  • kilkennycat © (10.12.17 22:59) [6]
    пример неудачный. во-первых, это работает не так, во-вторых, применение потока в этом примере еще более привлекательней, так как в текстовом редакторе будет крайне неудобно ждать после каждой клавиши, когда пересканирование завершится. Application.ProcessMessages конечно, сделает ожидание более веселым...
  • kilkennycat © (10.12.17 23:03) [7]
    и вообще, имеет смысл научиться пользоваться хотя бы встроенным отладчиком. чтобы посмотреть, как MyFunc выглядит в асме. А то, внезапно окажется, что SyspenpdFunc берется всего лишь раз, при вызове функции, и всякие манипуляции с ней потом как бэ не имеют смысла.
  • kashey (10.12.17 23:13) [8]

    > и вообще, имеет смысл научиться пользоваться хотя бы встроенным
    > отладчиком. чтобы посмотреть, как MyFunc выглядит в асме.
    >

    Для меня это пока инопланетные технологии.


    > А то, внезапно окажется, что SyspenpdFunc берется всего
    > лишь раз, при вызове функции

    Ну почему? с Application.ProcessMessages подсунуить SyspenpdFunc по моему можно
  • kashey (10.12.17 23:27) [9]

    > пример неудачный. во-первых, это работает не так,

    Вот как, так и не удалось нануглить, буду признателен если объясните как.
  • kilkennycat © (10.12.17 23:45) [10]
    https://ru.wikipedia.org/wiki/SynEdit


    > Ну почему? с Application.ProcessMessages подсунуить SyspenpdFunc  по моему можно

    можно. но компилятор (с оптимизацией особенно) может так не думать.
  • Leonid Troyanovsky © (11.12.17 09:54) [11]

    > kashey   (10.12.17 23:27) [9]

    > Вот как, так и не удалось нануглить, буду признателен если
    > объясните как.

    https://rsdn.org/forum/delphi/942829.1

    --
    Regards, LVT.
  • sniknik © (11.12.17 10:33) [12]
    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;

    type
     TForm1 = class(TForm)
       procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
       procedure FormCreate(Sender: TObject);
       procedure FormKeyPress(Sender: TObject; var Key: Char);
     private
     public
       procedure MyFunc;
     end;

    var
     Form1: TForm1;

    implementation

    {$R *.dfm}

    const
     MaxN = 100000;
    var
     n: integer;

    procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
     n:= MaxN;
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
     n:= MaxN;
    end;

    procedure TForm1.MyFunc;
    begin
     while n < MaxN do begin
       Caption:= IntToStr(n);
       Inc(n);
       Application.ProcessMessages;
     end;
    end;

    procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
    begin
     if n < N then
       n:= 0
     else begin
       n:= 0;
       MyFunc;
     end;
    end;

    end.

  • kashey (11.12.17 10:53) [13]

    > sniknik ©   (11.12.17 10:33) [12]

    Нормальный вариант, как для моей задачи. Самому додуматься была не судьба ((
 
Конференция "Начинающим" » перезапуск функции [D7]
Есть новые Нет новых   [118237   +10][b:0.043][p:0.023]