-
Поясню вопрос сразу кодом. Помогите с правильным примером кода. Всю равно вызовы накапливаюся.
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
public
procedure MyFunc;
end;
var
Form1: TForm1;
n: Integer;
InFunc, SyspenpdFunc: Boolean;
implementation
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.
-
-
А потоки здесь при чем?
-
они хорошо помогают в случае если не удается выстрелить себе в ногу, но очень хочется. как в описанном выше случае.
-
> rrrrrr © (10.12.17 22:28) [3]
отлично сказал )
-
т.е. без потока не получится? Ну наверняка же как-то можно?
Ну вот приведу пример редактора с подсветкой кода, где после каждого нажатия клавиши нужно сканировать текст, но текст может быть очень большой и нужно оборвать предыдущее сканирование и начать новое.
-
пример неудачный. во-первых, это работает не так, во-вторых, применение потока в этом примере еще более привлекательней, так как в текстовом редакторе будет крайне неудобно ждать после каждой клавиши, когда пересканирование завершится. Application.ProcessMessages конечно, сделает ожидание более веселым...
-
и вообще, имеет смысл научиться пользоваться хотя бы встроенным отладчиком. чтобы посмотреть, как MyFunc выглядит в асме. А то, внезапно окажется, что SyspenpdFunc берется всего лишь раз, при вызове функции, и всякие манипуляции с ней потом как бэ не имеют смысла.
-
> и вообще, имеет смысл научиться пользоваться хотя бы встроенным > отладчиком. чтобы посмотреть, как MyFunc выглядит в асме. >
Для меня это пока инопланетные технологии.
> А то, внезапно окажется, что SyspenpdFunc берется всего > лишь раз, при вызове функции
Ну почему? с Application.ProcessMessages подсунуить SyspenpdFunc по моему можно
-
> пример неудачный. во-первых, это работает не так,
Вот как, так и не удалось нануглить, буду признателен если объясните как.
-
https://ru.wikipedia.org/wiki/SynEdit > Ну почему? с Application.ProcessMessages подсунуить SyspenpdFunc по моему можно
можно. но компилятор (с оптимизацией особенно) может так не думать.
-
-
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
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.
-
> sniknik © (11.12.17 10:33) [12]
Нормальный вариант, как для моей задачи. Самому додуматься была не судьба ((
|