![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]Если не ошибаюсь - да.
только вот зачем?