![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() Есть процедура. Которая может выполняться ну очень долго в силу большого объёма исходного материала. Ну например, какое-нибудь копирование, парсинг, постинг.
Так вот вопрос - как поставить выполнение на паузу, и как остановить. В качестве примера, приведу код процедуры с которой мне вчера помогли - копирование с задержкой: Код:
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
|
||||
|
||||
![]() TThread: Create, Suspend, Resume, Terminate
Пишу программы за еду. __________________ Последний раз редактировалось NumLock, 14.10.2010 в 10:39. |
#3
|
|||
|
|||
![]() Цитата:
Код:
{Определение класса 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
|
||||
|
||||
![]() Код:
procedure TMyThread.Execute; begin DoWork; end; Пишу программы за еду. __________________ |
#5
|
|||
|
|||
![]() Цитата:
Теперь ещё более нубский вопрос - по структуре программы. Дело в том, что ковыряюсь я с дельфи - где-то неделю и ещё много пробелов. Цитата:
Нужно размещать после: unit interface uses И перед: type TForm1 = class(TForm) ? Насколько я знаю, type определяет новую категорию переменной или процесса. А чем этот блок type должен завершаться? implementation? Каждый блок или все? |
#6
|
||||
|
||||
![]() 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
|
||||
|
||||
![]() хм...
а если что-нить такое: Код:
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. |