Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.08;
Скачать: CL | DM;

Вниз

TThread и Synchronize   Найти похожие ветки 

 
Labert   (2004-07-26 12:21) [0]

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

Как известно, при обращении к свойствам и методам 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;

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


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

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


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

Зачем:

Во-первых, параметром 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:44) [3]

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

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


 
TUser ©   (2004-07-26 12:46) [4]

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


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

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

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

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

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

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

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

Вот


 
VMcL ©   (2004-07-26 12:53) [6]

>>Labert  (26.07.04 12:21)

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

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


 
VMcL ©   (2004-07-26 12:58) [7]

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

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


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


 
Reindeer Moss Eater ©   (2004-07-26 12:59) [8]

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

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


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


 
KSergey ©   (2004-07-26 13:03) [9]

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

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


 
TUser ©   (2004-07-26 13:04) [10]

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


 
Reindeer Moss Eater ©   (2004-07-26 13:40) [11]

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

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


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

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2004.08.08;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.032 c
14-1090582484
Fishka
2004-07-23 15:34
2004.08.08
Тесты на знание MS SQL и Delphi на русском языке


1-1090838969
Фагот
2004-07-26 14:49
2004.08.08
Планировщик


1-1090509542
Ego
2004-07-22 19:19
2004.08.08
поле DBGrid.


1-1090489685
Chery
2004-07-22 13:48
2004.08.08
Как задать частоту монитора?


1-1090567631
segor
2004-07-23 11:27
2004.08.08
перекрыть метод закрытия формы