Форум: "Основная";
Текущий архив: 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