Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.034 c
14-1090610914
Opilki_Inside
2004-07-23 23:28
2004.08.08
В эту субботу поезд....


4-1088592610
nik7777
2004-06-30 14:50
2004.08.08
Как перехватить изменения в реестре


14-1090322145
<DeL.>
2004-07-20 15:15
2004.08.08
Счетчик скачиваний на ПХП


4-1088510202
MetalFan
2004-06-29 15:56
2004.08.08
не работает AllocateHWND(((


3-1089711869
Igor2
2004-07-13 13:44
2004.08.08
DBGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский