Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 10 11 12 13 14 15 16 17 18 [19]
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
Vlad F
Member

Откуда:
Сообщений: 807
Freestyler,

Резюмирую, скрипач поток не нужен, по таймеру запускается упомянутый алгоритм, дизейблит пользовательскую кнопку, отрабатывает свое, енайблит кнопку, рестартует таймер до следующей итерации. При нажатии кнопки сходным образом дизейблиться/енайблиться таймер.
4 янв 19, 14:55    [21778396]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3903
Freestyler,

вот без компонента:
+
type
  TRunSPThread = class( TThread )
  private
    FWaitEvent: TSimpleEvent;
  protected
    procedure Execute; override;
  public
    constructor Create;
    destructor Destroy; override;

    procedure WakeUp;
  end;

constructor TRunSPThread.Create;
begin
  inherited Create( False );
  FWaitEvent := TSimpleEvent.Create;
end;

destructor TRunSPThread.Destroy;
begin
  Terminate;
  FWaitEvent.SetEvent;
  inherited Destroy;
  FWaitEvent.Free;
end;

procedure TRunSPThread.Execute;
begin
  repeat
    FWaitEvent.ResetEvent;
    FWaitEvent.WaitFor( 10 * 60 * 1000 );
    if Terminated then
      Exit;

    // run SP
  until not Terminated;
end;

procedure TRunSPThread.WakeUp;
begin
  FWaitEvent.SetEvent;
end;

"если пользователь нажал кнопку" - то вызываем WakeUp.

Freestyler
нужно дождаться завершения обработки и по ее результатам или повторный запуск или обработка не требуется

Это уже навороты, делай сам. Например, нужен дополнительный Event, которого ждать в начале WakeUp.
4 янв 19, 15:04    [21778401]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
Freestyler
Member

Откуда:
Сообщений: 66
Vlad F,

Спасибо.
в таком варианте будет блокировать работу приложения
4 янв 19, 16:31    [21778442]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
Freestyler
Member

Откуда:
Сообщений: 66
YuRock,

Спасибо за пример!
+- такой вариант работает сейчас. была мысль переложить доп. потоки на компонент.
4 янв 19, 16:33    [21778443]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
Vlad F
Member

Откуда:
Сообщений: 807
Freestyler
в таком варианте будет блокировать работу приложения

А я тебя переспросил, и ты сказал что приложение все равно ждет окончания обработки.
4 янв 19, 16:54    [21778461]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
Vlad F
Member

Откуда:
Сообщений: 807
Freestyler
+- такой вариант работает сейчас. была мысль переложить доп. потоки на компонент.

Больше компонентов, хороших и разных!!))
4 янв 19, 16:56    [21778464]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
Freestyler
Member

Откуда:
Сообщений: 66
Vlad F,

безусловно автору спасибо за компонент!
хотелось попробовать применить в проекте.
задача думаю типовая для многих - периодически что-то делать (подтягивать) в фоне
при этом чтобы была возможность пользователю это сделать явно
4 янв 19, 18:43    [21778506]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25431
Freestyler
Добрый день!

подскажите как можно реализовать с помощью компонента такой порядок работы:

обработка выполняется в потоке с периодичностью (например 10 минут)
при этом пользователь может по кнопке принудительно запустить эту же обработку.

требуется ли внешний таймер?

Можно. Достаточно метода Task WaitMS и проверки флага Terminated перед запуском задачи.
6 янв 19, 20:04    [21779217]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
Freestyler
Member

Откуда:
Сообщений: 66
wadman,

то есть процедура вида

procedure Task_1_Execute;
begin
  repeat
    WaitMS 
    if Terminated then
      Exit;

    // run SP
  until not Terminated;
end;


как тогда лучше сделать принудительный запуск (по кнопке) ?
просто проверить если задача не завершена то не делать?
6 янв 19, 20:36    [21779226]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25431
Freestyler,

подумав на трезвую голову я-бы все таки сделал с таймером, но который запускает задачу в потоке. Плюс кнопка, которая запускает задачу и сбрасывает таймер. Так проще.
9 янв 19, 08:18    [21780235]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
Док
Member

Откуда: Казань
Сообщений: 6163
Отсюда

Док
демок в комплекте OPM нету что ли?

а, нет, вижу. Правда у меня только SimpleDemo запустилось без установки доп.компонент.

Кстати, если трижды нажать на DemoTimer, то получим отлуп

Project WCThreadDemo raised exception class 'Exception' with message:
TaskDemoTimer cannot start while destroying.

 In file 'wcthread.pas' at line 654:
raise Exception.CreateFmt('%s cannot start while destroying.', [Name]);


По-моему, я тебе про это уже говорил.
9 фев 19, 00:21    [21805000]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25431
Док
Отсюда

Док
демок в комплекте OPM нету что ли?

а, нет, вижу. Правда у меня только SimpleDemo запустилось без установки доп.компонент.

Кстати, если трижды нажать на DemoTimer, то получим отлуп

Project WCThreadDemo raised exception class 'Exception' with message:
TaskDemoTimer cannot start while destroying.

 In file 'wcthread.pas' at line 654:
raise Exception.CreateFmt('%s cannot start while destroying.', [Name]);



По-моему, я тебе про это уже говорил.

Много кто говорил. Там системный слип для имитации тяжелой работы. Нужно заменить самой работой с проверкой терминатора задачи/потока.
9 фев 19, 00:41    [21805003]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 10 11 12 13 14 15 16 17 18 [19]
Все форумы / Delphi Ответить