Поток и timer

LMag
Дата: 22.11.2019 22:46:59
Здравствуйте.

У меня следующий вопрос.

Как мне запускать поток каждые <опредмеченное время в секундах>?

Я создал класс потока

  TCountOperOrdersThread = class(TThread)
     FQuery : TpFIBQuery;
     TTans : TpFIBTransaction;
     private
        procedure RefrOrdersOper;
     protected
        procedure Execute;override;
  end;


все методы реализовал, теперь сам поток вызываю через компонент TTimer , используя метод OnTimer:

Ontimer 

.......

   CountOrdersOper := TCountOperOrdersThread.Create(true);
   CountOrdersOper.FreeOnTerminate := true;
   CountOrdersOper.Priority := tpLower;
    CountOrdersOper.Resume;

.....


Теперь через определенное время, срабатывает таймер и выполняется OnTimer, в это время происходит подвисание основной программы.

У меня вопрос как сделать так, что поток не мешал основной программе, ну то есть чтоб она не подвисала?
Dimitry Sibiryakov
Дата: 22.11.2019 23:00:28

LMag
как сделать так, что поток не мешал основной программе, ну то есть чтоб она не подвисала?

Написать его правильно. Граблей для новичка на этом пути немерено. От огульного
использования Synchronize до сериализации вызовов Firebird API в пределах одного коннекта
клиентской библиотекой.

Posted via ActualForum NNTP Server 1.5

LMag
Дата: 22.11.2019 23:03:15
Я понимаю что надо писать правильно, но как или дайте ссылку

метод execute я реализовал так
procedure TCountOperOrdersThread.Execute;
begin
  inherited;
  Synchronize(RefrOrdersOper);
end;
Dimitry Sibiryakov
Дата: 22.11.2019 23:06:41

LMag
метод execute я реализовал так

Ну да, худший сценарий, типичная ошибка. Человек, написавший этот неправильный код давно
умер, но дело его живёт. Synchronize надо использовать очень осторожно. Читай штатную справку.

Posted via ActualForum NNTP Server 1.5

Квейд
Дата: 22.11.2019 23:21:19
LMag
Я понимаю что надо писать правильно, но как или дайте ссылку

метод execute я реализовал так
procedure TCountOperOrdersThread.Execute;
begin
  inherited;
  Synchronize(RefrOrdersOper);
end;
то, что ты написал, это то же самое как если бы ты вызывал RefrOrdersOper в основном потоке
LMag
Дата: 22.11.2019 23:52:47
А как тогда переписать
Док
Дата: 23.11.2019 00:22:21
LMag,

А что делает доп.поток? Какие-то циклические действия?

Если так, то можно использовать эвенты. По таймеру взводить и сбрасывать эвент, который будет соответственно замораживать/размораживать доп.поток
LMag
Дата: 23.11.2019 00:27:54
Док,

Ну поток опрашивает базу на количество введеных записей тем или иным оператором.

Хотел бы узнать как отдельным эвентом останавливать и запускать поток?
Barmaley57
Дата: 23.11.2019 00:34:01
LMag
Ну поток опрашивает базу на количество введеных записей тем или иным оператором.
Обычного события таймера хватит с головой.
Barmaley57
Дата: 23.11.2019 00:35:03
Ещё есть Application.OnIdle....но это, наверное, хуже...