Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Завершение процедуры, Как завершить одну процедуру из другой 
:(
    Опции темы
Slawanix
  Дата 16.8.2004, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 29.7.2004
Где: г. Великие Луки

Репутация: нет
Всего: 1



Подскажите, пожалуйста: можно ли из одной процедуры, например при нажатии кнопки, прервать выполнение другой процедуры (к примеру копирование файлов в цикле).
Если можно, дайте хоть какой-нибудь намек, как...Please. sample.gif
--------------------
моск кипит    
PM MAIL WWW   Вверх
Burich-Caeser
Дата 16.8.2004, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 28.7.2004

Репутация: нет
Всего: 1



А простой вариант, чтобы процедура, которая должна прерваться проверяла какую-нить bool переменную и, если что, то exit не прокатит? В обработчике нажатия, например меняешь эту самую переменную...
Только, наверное в обрабатываемой будет нелишним писать Application.ProcessMessage;
Как всегда, желаю удачи с проектом hehe.gif
--------------------
Ты брошен вниз силой судьбы,Ты унижен и раздавлен,Время забыть то, кем ты был,Но помнить, кем ты стал...
PM MAIL   Вверх
S.A.P.
Дата 16.8.2004, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 2
Всего: 71



Используй потоки: копирование файлов осуществляет один поток, а обработку нажатия клавиши-другой. Поток можно приостановить, изменить приоритет или уничтожить. Чтобы не изобретать велосипед,IMHO для нескольких параллельно выполняемых операций потоки - самое оптимальное решение.
PM MAIL   Вверх
Song
Дата 16.8.2004, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



по установке глобального флага.


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Slawanix
Дата 17.8.2004, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 29.7.2004
Где: г. Великие Луки

Репутация: нет
Всего: 1



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


--------------------
моск кипит    
PM MAIL WWW   Вверх
Burich-Caeser
Дата 18.8.2004, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 28.7.2004

Репутация: нет
Всего: 1



Slawanix
Всегда пожалуйста.
--------------------
Ты брошен вниз силой судьбы,Ты унижен и раздавлен,Время забыть то, кем ты был,Но помнить, кем ты стал...
PM MAIL   Вверх
Medved
Дата 18.8.2004, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154



Можешь отправлять сообщения. SendMessage, PostMessage.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Slawanix
Дата 21.8.2004, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 29.7.2004
Где: г. Великие Луки

Репутация: нет
Всего: 1



Цитата
Можешь отправлять сообщения. 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

Это сообщение отредактировал(а) Slawanix - 21.8.2004, 16:31
--------------------
моск кипит    
PM MAIL WWW   Вверх
youri
Дата 21.8.2004, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: нет
Всего: 16



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;

PM   Вверх
Pakshin A. S.
Дата 21.8.2004, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Цитата
Не понял, зачем ты использовал Synchronized

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

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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 29.7.2004
Где: г. Великие Луки

Репутация: нет
Всего: 1



Цитата
Не понял, зачем ты использовал Synchronized

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

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

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


--------------------
моск кипит    
PM MAIL WWW   Вверх
Pakshin A. S.
Дата 22.8.2004, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



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

PM   Вверх
Slawanix
Дата 22.8.2004, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 29.7.2004
Где: г. Великие Луки

Репутация: нет
Всего: 1



Цитата
Написал небольшую прогу (даже самому понравилось)

Мне тоже понравилось, простенько и достаточно наглядно работает. Только я одного не понял, у меня так пока и не получилось, таким же образом заправить свою процедуру, в которой идет вызов других, описанных в других модулях, напрашивается предположение, что придется все описывать в методе Execute; муторно, но наверное так и сделаю.
smile.gif
С уважением, Slawanix wink.gif
--------------------
моск кипит    
PM MAIL WWW   Вверх
Slawanix
  Дата 29.8.2004, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 29.7.2004
Где: г. Великие Луки

Репутация: нет
Всего: 1



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

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0602 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.