Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2017, 09:03   #1
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию Проблемы с потоком

Привет, нужно в программу повесить отображение времени без секунд, я сперва юзал таймер но при его итерации вся форма моргала, ни и вообще таймеры использовать плохо. ну я не долго думая убрал таймер и сделал поток, но после этого программа начала жрать 25% когда открыта, можно ли это как то уменьшить?
Вот код класса
Код:
  TTimerThread = class(TThread)
  protected
    procedure Execute; override;
  end;
вот код сворачивания
Код:
  Connection.Connected := false;
  IdTCPServer1.Active := false;
  while MDIChildCount <> 0 do
    MDIChildren[0].Destroy;
  CanClose := cc;
  if not cc then
  begin
    tth.free;
    Hide;
  end;
вот код Show
Код:
tth := TTimerThread.create();
и код execute
Код:
procedure TTimerThread.Execute;
begin
  while not tth.Terminated do
  begin
    if fGeneral.Showing then
      fGeneral.CoolBar1.Bands[1].Text := 'Дата: ' +
        FormatDateTime('dd.MM.yy HH:mm', now);
  end;
end;
PTyTb32 вне форума Ответить с цитированием
Старый 22.09.2017, 09:17   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

PTyTb32
Для такой задачи плохим тоном считается как раз использовать потоки.

Делайте на таймере - НО не более 1 таймера на форму.

Цитата:
Сообщение от PTyTb32 Посмотреть сообщение
вся форма моргала
Это отдельный вопрос и самый простой. Form1.DoubleBuffered:=true;
Цитата:
Сообщение от PTyTb32 Посмотреть сообщение
но после этого программа начала жрать 25% когда открыта, можно ли это как то уменьшить?
Вставляйте паузы или отдавайте управление другому потоку.
Sleep(1);
SwitchToThread();



Цитата:
Сообщение от PTyTb32 Посмотреть сообщение
if fGeneral.Showing then
fGeneral.CoolBar1.Bands[1].Text := 'Дата: ' +
FormatDateTime('dd.MM.yy HH:mm', now);
VCL компоненты не являются потокобезопасными, при доступи к ним из потока их следует оборачивать в Synchronize

Код:
procedure TTimerThread.UpdateForm;
begin
  if fGeneral.Showing then
      fGeneral.CoolBar1.Bands[1].Text := 'Дата: ' +
        FormatDateTime('dd.MM.yy HH:mm', now);
end;

procedure TTimerThread.Execute;
begin
  while not tth.Terminated do
  begin
   Synchronize(UpdateForm);
   Sleep(100); // 100 мс время осознанной реакции мозга, так что меньше нет смысла ставить 
  end;
end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 22.09.2017, 09:53   #3
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию

Pavia спасибо, попробую, а что значит "потокобезопасными"? сделал с таймером, моргать перестала.

Последний раз редактировалось PTyTb32; 22.09.2017 в 09:59.
PTyTb32 вне форума Ответить с цитированием
Старый 22.09.2017, 10:27   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

https://ru.wikipedia.org/wiki/Thread-safety
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с потоком stasa9711 Общие вопросы Delphi 9 24.03.2014 22:35
Проблемы с потоком HELMOS Общие вопросы Delphi 16 01.02.2013 23:30
Проблемы с потоком spydark91 Общие вопросы Delphi 38 23.06.2011 16:23
Проблема с потоком Araver Общие вопросы Delphi 4 16.10.2007 04:30