Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.10.2010, 09:42
MrDiG MrDiG вне форума
Начинающий
 
Регистрация: 05.10.2010
Сообщения: 112
Репутация: 1227
По умолчанию Пауза и остановка процедуры

Есть процедура. Которая может выполняться ну очень долго в силу большого объёма исходного материала. Ну например, какое-нибудь копирование, парсинг, постинг.

Так вот вопрос - как поставить выполнение на паузу, и как остановить. В качестве примера, приведу код процедуры с которой мне вчера помогли - копирование с задержкой:
Код:
procedure TForm1.FakeCheck;
var i:integer;
begin
for i := 0 to Memo3.Lines.Count - 1 do begin
StatusBar1.Panels.Items[0].Text:= Memo3.Lines[i];
delay(2); //тут задержка в секундах
ProgressBar1.Position:=Round(1000 * i/Memo3.Lines.Count-1);
end;
end;

Нужно обрабатывать её тремя кнопками.
Запуск, Пауза, Стоп

Если с запуском, всё прозрачно, то как её остановить, или прервать - только мысли.
Например, использовать конструкцию вроде Form1.Tag := 0; при запуске. По нажатию на кнопку паузы менять значение допустим на единицу, ну а при 2 - останавливать.
Ответить с цитированием
  #2  
Старый 14.10.2010, 10:34
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

TThread: Create, Suspend, Resume, Terminate
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 14.10.2010 в 10:39.
Ответить с цитированием
  #3  
Старый 14.10.2010, 11:23
MrDiG MrDiG вне форума
Начинающий
 
Регистрация: 05.10.2010
Сообщения: 112
Репутация: 1227
По умолчанию

Цитата:
Сообщение от NumLock
TThread: Create, Suspend, Resume, Terminate
Код:
 {Определение класса TMyThread}
 type
   TMyThread = class(TThread)
   private
     { Private declarations }
   protected
     procedure DoWork;
     procedure Execute; override;
   end;

 implementation

 procedure TMyThread.Execute;
 begin
 Synchronize(DoWork);
 end;

 procedure TMyThread.DoWork;
 begin
 {Сюда, как я понимаю код своей процедуры?}
 end;


На кнопочки вешаем:

TMyThread.Execute; //запуск
TMyThread.Suspend; //пауза
TMyThread.Resume; //продолжить
TMyThread.Terminate; //остановить

Я всё правильно понял?

2 friz, спасибо. Буду проверять и более простой вариант.
Ответить с цитированием
  #4  
Старый 14.10.2010, 11:46
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
 procedure TMyThread.Execute;
 begin
 DoWork;
 end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 14.10.2010, 12:04
MrDiG MrDiG вне форума
Начинающий
 
Регистрация: 05.10.2010
Сообщения: 112
Репутация: 1227
По умолчанию

Цитата:
Сообщение от NumLock
Код:
 procedure TMyThread.Execute;
 begin
 DoWork;
 end;
Ну почему без Synchronize я кажется понимаю - это тупо гарантия, что к каждому объекту VCL одновременно имеет доступ только один поток. А т.к. поток пока один - то и думать не нужно.

Теперь ещё более нубский вопрос - по структуре программы. Дело в том, что ковыряюсь я с дельфи - где-то неделю и ещё много пробелов.

Цитата:
type
TMyThread = class(TThread)
private
{ Private declarations }
protected
procedure DoWork;
procedure Execute; override;
end;

Нужно размещать после:

unit
interface
uses

И перед:

type
TForm1 = class(TForm)
?

Насколько я знаю, type определяет новую категорию переменной или процесса. А чем этот блок type должен завершаться? implementation?
Каждый блок или все?
Ответить с цитированием
  #6  
Старый 14.10.2010, 13:20
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

1. не совсем так про Synchronize. как раз наоборот: все потоки могут одновременно обращаться к VCL (в данном случае основной поток и TMyThread) и из-за этого и возникают пролемы. Synchronize для этого и нужен - вызывать метод в основном потоке VCL, что гарантирует безопасное обращение.
2. описание класса в секции interface, реализация в implementation:
Код:
unit Unit1;

interface

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

type
  TMyThread = class(TThread)
  public
    constructor Create();
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TMyThread }

constructor TMyThread.Create;
begin
  inherited Create(False);
end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  //
end;

end.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #7  
Старый 14.10.2010, 10:35
Аватар для friz
friz friz вне форума
Местный
 
Регистрация: 04.04.2008
Адрес: Минск
Сообщения: 596
Версия Delphi: 2007 & JAVA EE
Репутация: 10670
По умолчанию

хм...
а если что-нить такое:
Код:
for i:=1 to zu do
begin
  if action=3 then break;
  if action=2 then delay(2);
  if action=1 then 
                     begin
                        выполняем что-то
                     end;
end;

ну и при клике на старт action=1 при клике на стоп action=3 и т.п.
__________________
Последний раз редактировалось Admin, Сегодня в 10:32.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:28.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025