Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Завершение процедуры


Автор: Slawanix 16.8.2004, 00:10
Подскажите, пожалуйста: можно ли из одной процедуры, например при нажатии кнопки, прервать выполнение другой процедуры (к примеру копирование файлов в цикле).
Если можно, дайте хоть какой-нибудь намек, как...Please. sample.gif

Автор: Burich-Caeser 16.8.2004, 01:06
А простой вариант, чтобы процедура, которая должна прерваться проверяла какую-нить bool переменную и, если что, то exit не прокатит? В обработчике нажатия, например меняешь эту самую переменную...
Только, наверное в обрабатываемой будет нелишним писать Application.ProcessMessage;
Как всегда, желаю удачи с проектом hehe.gif

Автор: S.A.P. 16.8.2004, 10:11
Используй потоки: копирование файлов осуществляет один поток, а обработку нажатия клавиши-другой. Поток можно приостановить, изменить приоритет или уничтожить. Чтобы не изобретать велосипед,IMHO для нескольких параллельно выполняемых операций потоки - самое оптимальное решение.

Автор: Song 16.8.2004, 10:43
по установке глобального флага.

Автор: Slawanix 17.8.2004, 22:28
Burich-Caeser , я поискал в форуме по потокам и нашел твои ссылочки, они мне пригодились, спасибо rolleyes.gif !
Также спасибо Perchilla и Song ; Сечас набрал кучу доков, ушел разбираться. Удачи!
wink.gif


Автор: Burich-Caeser 18.8.2004, 01:10
Slawanix
Всегда пожалуйста.

Автор: Medved 18.8.2004, 09:32
Можешь отправлять сообщения. SendMessage, PostMessage.

Автор: Slawanix 21.8.2004, 00:35
Цитата
Можешь отправлять сообщения. SendMessage, PostMessage.

Pegas, Спасибо, попробую воспользоваться твоим советом, но пока я уже начал делать с потоками, и тут у меня возникла проблемка(см.ниже<>если интересно).
С уважением, Slawanix.
smile.gif
Добавлено @ 00:42
Поммжите, пожалуйста разобраться с потоком. Сейчас объясню, в чем дело.
Вот модуль с потоком:

Код
unit Threads;

interface

uses
 Classes;

type
 TScanThread = class(TThread)
 private
   { Private declarations }
 protected
   procedure Scanning;
   procedure Execute; override;
 end;

implementation

uses Search, Sync;

{ TScanThread }

procedure TScanThread.Scanning;
begin
 ScannerBoss;
end;


procedure TScanThread.Execute;
begin
 Synchronize(Scanning);
end;

end.


Вот так я вызываю поток в главном модуле:

Код

unit Sync;

interface

uses ..., Threads, ...;
...
type
 TForm1 = class(TForm)
...
public
 ThrScan:TScanThread;
...
при нажатии кнопки

ThrScan:=TScanThread.Create(false);


Проблема такая: хочу сделать
Код
ThrScan.Suspend
или
Код
ThrScan.Terminate;
поток продолжает работать без изменений и ошибок.
если делаю:
Код
ThrScan.Destroy;
или
Код
ThrScan.Free;
прога виснет (и в диспетчере задач в NT - не отвечает).
А нужно либо приостановить поток, либо вообще грохнуть.
Примечание: функция ScannerBoss ,без ипользования потока работает номано, и я думаю, она здесь ни при чем.
Заранее очень благодарен. inlove.gif inlove.gif inlove.gif

Автор: youri 21.8.2004, 20:34
1. Не понял, зачем ты использовал Synchronized
2. Написал небольшую прогу (даже самому понравилось). Четыре кнопки
(Execute, Suspend, Resume, Terminate) и ProgressBar
Код
type
TScanThread = class(TThread)
private
 { Private declarations }
protected
 procedure Execute; override;
end;

var
 ThrScan:TScanThread;

procedure TScanThread.Execute;
begin
while(TRUE) do
begin
 if Form1.ProgressBar1.Position <> Form1.ProgressBar1.Max then
   Form1.ProgressBar1.StepIt
 else
   Form1.ProgressBar1.Position := Form1.ProgressBar1.Min;
 sleep(100);
 if Terminated then
   break;
end;
end;

procedure TForm1.ExecuteClick(Sender: TObject);
begin
 ThrScan:=TScanThread.Create(false);
end;

procedure TForm1.SuspendClick(Sender: TObject);
begin
 ThrScan.Suspend();
end;

procedure TForm1.ResumeClick(Sender: TObject);
begin
 ThrScan.Resume;
end;

procedure TForm1.TerminateClick(Sender: TObject);
begin
 ThrScan.Terminate;
// данный метод устанавливает свойство Terminated:=TRUE и
// подраумевает, что метод Execute проверяет это свойство и как только
// это свойство TRUE, поток должен завершить выполнение (нет
// никакого принудительного завершения)
end;

Автор: Pakshin A. S. 21.8.2004, 21:29
Цитата
Не понял, зачем ты использовал Synchronized

Может для управления вимзуальными компонентами...

Как я понял, что гораздо лучше и культурней общаться с формой и компонентами через синхронизацию. (анти-примером в этом случае может служить код youri, тока без обид biggrin.gif )
Добавлено @ 21:34
И ещё: для простейшего способа гарантированно освободить объект потока - установить в начале Execute свойства FreeOnTerminate равным True.

Автор: Slawanix 21.8.2004, 22:52
Цитата
Не понял, зачем ты использовал Synchronized

Да, как и сказал Pakshin A. S. , в процедуре ScannerBoss действительно доступ к объектам VCL идет. smile.gif

Цитата
установить в начале Execute свойства FreeOnTerminate равным True.

Это я пробовал - результат такой же, только вот в ScannerBoss у меня вызывается еще пара процедур, может быть дело в этом и нужно в поток помещать чистую процедуру без вложенных... надо попробовать, если получиться расскажу. cool.gif
Спасибо. Но пока еще тема не закрыта. rolleyes.gif rolleyes.gif


Автор: Pakshin A. S. 22.8.2004, 12:42
FreeOnTerminate - это так, для культуры. Можно и без этого обходиться, как в примере youri . biggrin.gif

Автор: Slawanix 22.8.2004, 23:22
Цитата
Написал небольшую прогу (даже самому понравилось)

Мне тоже понравилось, простенько и достаточно наглядно работает. Только я одного не понял, у меня так пока и не получилось, таким же образом заправить свою процедуру, в которой идет вызов других, описанных в других модулях, напрашивается предположение, что придется все описывать в методе Execute; муторно, но наверное так и сделаю.
smile.gif
С уважением, Slawanix wink.gif

Автор: Slawanix 29.8.2004, 15:21
Нашел вариант как создать поток без TThread - при помощи API функций
(BeginThread;SuspendThread;ResumeThread;TerminateThread), но я не знаю, можно ли
как-то синхронизировать АПИшные потоки (это необходимо для доступа к компонентам VCL), типа как
это делается в Дэлфе(Synchronize)?
Помогите,если кто может, пожалуйста.
С уважением, Slawanix. qstn.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)