Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TThread и Synchronize


Labert ©   (2004-07-26 12:21:00) 

Вопрос вот возник интересный, может кто знает:

Как известно, при обращении к свойствам и методам VCL из потока нужно использовать Synchronize
Т.е. примерно так (из хэлпа):

procedure TMyThread.PushTheButton;
begin
 Button1.Click();
end;

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

В этом случае код метода PushTheButton исполняется в контесте Main VCL Thread.

Внимание, вопрос!

Если сделать так:

procedure TMyThread.PushTheButton;
begin
 Button1.Click();
end;

procedure TMyThread.PushTheButtonWrapper;
begin
PushTheButton;
end;

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

В этом случае будет ли код безопасным?


Labert   (2004-07-26 14:08:00) [1]

Да вопрос был вообще не про то нужен или не нужен

В том примере который я привел может и не нужен
реально может быть по-другому:

procedure TMyThread.Execute;
begin
Repeat
  Synchronize(OneMethod);
  <...>
  Какой-то_очень_полезный_код
  <...>
  Sleep(10000)
Until Terminated
end;


Reindeer Moss Eater   (2004-07-26 13:40:00) [2]

А что, ее лучше грузить дополнительным бесполезным окном?

Конечно лучше.
Во первых оно не бесполезное, во вторых система не тратит сил на переключение между потоками.


TUser   (2004-07-26 13:04:00) [3]

А что, ее лучше грузить дополнительным бесполезным окном?


KSergey   (2004-07-26 13:03:00) [4]

> [5] Labert   (26.07.04 12:53)
> (но я хочу без таймера)

Это не аргумент.
Сообщения и с таймером бедут обрабатываться нормально. Так зачем второй поток тут? Да еще который собственно в этом втором потоке не делает ровным счетом ничего?


Reindeer Moss Eater   (2004-07-26 12:59:00) [5]

> procedure TMyThread.Execute;
> begin
> Repeat
>   Synchronize(OneMethod);
>   Sleep(10000)
> Until Terminated
> end;

Нужен тут второй поток? Нужен!
(Можно конечно TTimer или SetTimer() еще использовать, но я хочу без таймера)


Ну и зачем здесь конкретно такойвторичный поток?
Это одно сплошное недоразумение


VMcL   (2004-07-26 12:58:00) [6]

>>Labert  (26.07.04 12:53) [5]

> Нужен тут второй поток? Нужен!
Можно конечно TTimer или SetTimer() еще использовать, но я хочу без таймера


Не нужен. Зачем грузить систему бесполезным потоком?


Labert   (2004-07-26 12:53:00) [7]

Ну вот например нужна прога - демон, которая раз в 10 сек проверят, наступило какое то условие или нет.

Прога имеет нормальное окно, которое видно на экране, а для проверки условия лезет в БД.

Вполне реальная задача, ничего экзотического, так ведь?

Нужен тут второй поток? Нужен!
(Можно конечно TTimer или SetTimer() еще использовать, но я хочу без таймера)

Нужно этому второму потоку к VCL-объектам обращаться? Нужно!

Причем сама проверка условия занимает совсем немного времени, большую часть времени поток спит, а окно проги в это время нормально обрабатывает сообщения.

Вот


VMcL   (2004-07-26 12:53:00) [8]

>>Labert  (26.07.04 12:21)

>В этом случае будет ли код безопасным?

В конкретном приведенном случае - да. В общем случае - смотря кто и что написал :-)


TUser   (2004-07-26 12:46:00) [9]

Будет нормально. Так обычно параметры и 'передают' в методы, вызываемые через Synchronize.


KSergey   (2004-07-26 12:44:00) [10]

> procedure TMyThread.Execute;
> begin
> Repeat
>   Synchronize(OneMethod);
>   Sleep(10000)
> Until Terminated
> end;

Вот только маленький вопрос: зачем такой поток вообще нужен?
А так - разницы не вижу.


Labert   (2004-07-26 12:37:00) [11]

Зачем:

Во-первых, параметром Synchronize может быть только метод - процедура без параметров. А это часто неудобно.

Во-вторых:

Сравни:


procedure TMyThread.Execute;
begin
Repeat
  <..code..>
  Synchronize(Method1);
  <..code..>
  Synchronize(Method2);
  <..code..>
  Synchronize(Method3);
  <..code..>
  Synchronize(Method4);
  <..code..>
  Sleep(10000)
Until Terminated
end;


и


procedure TMyThread.OneMethod
begin
  <..code..>
  Method1;
  <..code..>
  Method2;
  <..code..>
  Method3;
  <..code..>
  Method4;
  <..code..>
end

procedure TMyThread.Execute;
begin
Repeat
  Synchronize(OneMethod);
  Sleep(10000)
Until Terminated
end;


Во втором случае методы MethodX могут быть какими угодно процедурами и функциями


KSergey   (2004-07-26 12:23:00) [12]

Если не ошибаюсь - да.
только вот зачем?


Наверх

Титульная страница Поиск, карта сайта Написать письмо