-
Как нужно правильно, не дожидаясь окончания выполнения Execute, прервать выполнение кода потока и освободится - NewThread.Free;? TNewThread = class(TThread)
private
protected
procedure Execute; override;
end;
var
Form1: TForm1;
implementation
procedure TNewThread.Execute;
begin
while true do ;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
NewThread: TNewThread;
begin
NewThread:=TNewThread.Create(true);
NewThread.FreeOnTerminate:=true;
NewThread.Priority:=tpLower;
NewThread.Resume;
end;
-
procedure TNewThread.Execute; begin while not Terminated do {ничего не делаем}; end;
procedure TForm1.Button1Click(Sender: TObject); var NewThread: TNewThread; begin NewThread := TNewThread.Create(true); NewThread.FreeOnTerminate := true; NewThread.Priority := tpLower; NewThread.Resume; Sleep(2000); // Дадим потоку NewThread поработать 2 секунды NewThread.Terminate; // а затем прервем его работу. end;
-
> Sleep(2000); // Дадим потоку NewThread поработать 2 секунды
А без этого?
-
Пояснение.
Вызов метода Terminate не прерывает работу потока NewThread немедленно, а только выставляет его флаг завершения (свойство Terminated).
В методе Execute этот флаг проверяется и если он выставлен, то происходит выход из метода Execute, что приводит к реальному завершению потока.
-
> fics © (09.04.17 19:00) [2]
> А без этого?
Нет проблем. Поток NewThread стартует (т.к. вызван метод Resume) и тут же завершится (т.к. Terminated = true).
-
Ясно. Вот, к примеру, если при новом нажатии клавиши вызов от предыдущего нажатия еще не доработал, то екстренно прервать его и начать выполнение сначала вообще не получится? procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
NewThread.Еxecute;
end; Посему получается, что будет сделать это вообще нереально.
-
> Нет проблем. Поток NewThread стартует (т.к. вызван метод > Resume) и тут же завершится (т.к. Terminated = true).
ну так не устраивает, нужно при необходимости быстро оборвать поток и начать заново. Чтобы это было не заметно в FormKeyPress при вводе текста в редактор
-
Начать новое выполнение того же самого потока без его завершения - не получится. А прямой вызов NewThread.Еxecute вообще не запускает новый поток, а только выполняет метод Execute в вызвавшемпотоке.
-
fics © (09.04.17 19:16) [5]
Было бы гораздо легче и полезнее, если бы была озвучена реальная задача, которую надо решить.
-
Что же делать:) Не в отдельном потоке тоже не получиься выходить из фунции так вызовы все равно в стеке
-
> fics © (09.04.17 19:41) [9] > Что же делать:)
То, что сказал Игорь - озвучить реальную задачу.
Причем именно саму реальную задачу, а не предполагаемые Вами способы ее решения. Способы найдем вместе.
-
> Игорь Шевченко © (09.04.17 19:38) [8] > > fics © (09.04.17 19:16) [5] > > Было бы гораздо легче и полезнее, если бы была озвучена > реальная задача, которую надо решить.
Озвучиваю. Самописный редактор с подсветкой строк, комментариев итд , где при вводе нового символа нужно запускать весь текст на анализ. При новом нажатии клавиши предыдущее сканирование становиться бессмысленным. А сканирования большого файла может длится секунды.
-
fics © (09.04.17 19:54) [11]
Найди исходники Far Colorer - он это делает мгновенно.
-
> Найди исходники Far Colorer - он это делает мгновенно.
Файл в несколько сот тысяч строк он мгновенно не обработает. И при быстром вводе пересканировка наверняка запускается заново. Ну буду копать, делать нечего.
-
Подсветка (рисование) происходит непосредственно по ходу парсинга?
-
ну так не устраивает, нужно при необходимости быстро оборвать поток и начать заново.
не нужно.
старый экземпляр - такой же точно (не хуже) чем тот который ты хочешь запустить. а тот который ты хочешь запустить - ничем не лучше того, который уже запущен.
все что ты тут делаешь (вместо полезного) - насилуешь систему, зачем-то стартуя и останавливая свои потоки.
-
> при вводе нового символа нужно запускать весь текст на анализ
вот есть такой текст: тут тыща строк
<wrap>ща мы тут введем новый символ</wrap>
и тут тыща строк зачем запускать весь текст на анализ, ведь по сути, ничего не изменилось? другой вариант:
<wrap>
тут тыща строк
<superwrap>ща мы тут испортим закрывающий тег</superwrap>
и тут тыща строк
<superwrap>
и тут тыща строк
</superwrap>
</wrap>
и даже в этом случае изменилась лишь координата </superwrap>, анализировать весь текст - бессмысленно и беспощадно
-
> fics © (09.04.17 19:54) [11]
> где при вводе нового символа нужно запускать весь текст на анализ.
Можно хоть в одном потоке всё организовать. Обработку запускать при срабатывании таймера простоя. Только саму обработку вести небольшими порциями, дабы быстро реагировать на возобновление ввода. See also https://rsdn.org/forum/delphi/942829.1-- Regards, LVT.
-
> И при быстром вводе пересканировка наверняка запускается заново. т.е. ты не нашел, не попробовал, не знаешь наверняка, а просто предполагаешь?
потоков вообще не нужно, берите пример с дельфевского редактора, там перерисовывается только видимая часть в обычном онпаинт... работает моментально, даже если по каждому клику перерисовывает все окно, хотя на самом деле не знаю как там внутри, может только введенную букву/примыкающее слово.
Far Colorer скорее всего организован также, а значит количество текста не влияет на скорость "покраски".
-
> Подсветка (рисование) происходит непосредственно по ходу > парсинга?
нет - строится массив состояний.
|