![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
треды [D5, NT4]
roman_tutov © (2002-06-22 11:48:00)пытаюсь программку разбить на треды
В тред вынес процедуры соединения с базой , а в основной
форме сручу бессмысленную анимацию .
Так вот при запуске этого хозяйства код в треде отрабатывает правильно , анимация на главной фовме тоже крутиться ,
но ни одну кнопочку / ползуночек я нажать не могу
и программа перерисовывает только анимацию а на все остильное кладет .
Почему ?
Tutov Roman (2002-06-24 14:57:00) [21]Так я совсем запутался...:( Зачем мне в DoWork передовать результат ? Какой код должен быть в DoWork. Т.е что он должен выполнять ?
Зы А как из треда этот самый тред закрыть ?
MBo (2002-06-24 14:48:00) [22]не совсем так. Synchronize ничего не вытягивает -просто обеспечивает безопасное взаимодействие.
Делай всю долгую работу в Execute (или вызывай из нее еще один метод Thread-a), а в DoWork передавай результаты
Tutov Roman (2002-06-24 14:31:00) [23]У меня разовое действие. Фактически мне нужно породить нитку ,
Нитка должна отработать 1 раз и далее она больше не нужна...
Получается что Synchronize передает выжимку работы процедуры
procedure TMyThread.DoWork . А если код отработал в процедуре
procedure TMyThread.Execute ? Synchronize и оттуда выжимку вытянет ?
MBo (2002-06-24 14:13:00) [24]краткая статья есть на этом сайте, в разделе Статьи, конечно.
В поставке Delphi есть отличный пример
>С чем синхронизироваться нужно
Взаимодействие с компонентами главного потока.
Пример - доп. поток скачивает информацию из Инета, по окончанию
скачки обрабатывает принятые данные, и с помощью Synchronize передает выжимку (небольшой объем) в Memo на форме. Во время выполнения метода, запущенного с помощбю Synchronize, главный поток ждет, не выполняя никаких действий, по окончанию возобновляет свою работу.
В твоей задаче, если действие разовое, можно убрать
while not Terminated do begin,
а если нет, то можно при необходимости останавливать поток из него самого.
Tutov Roman (2002-06-24 14:01:00) [25]Что есть VCL
Tutov Roman (2002-06-24 13:57:00) [26]Что значит не требующее синхронизации ? С чем синхронизироваться нужно ? И главноне зачем. Может статья толковая где есть ?
Кстати я попробовал сделать как выше написано ,глюки полезли странные ,Тот код что сам по себе нормально работал , стал
подглючивать . То таблицу не увидели , то еще чего ...
MBo (2002-06-24 13:24:00) [27]Понятно, непрерывное обращение к главному потоку все замораживает.
стоит сделать так
procedure TMyThread.Execute;
begin
while not Terminated do begin
/// здесь делать работу, не требующую синхронизации
Synchronize(DoWork);
end;
procedure TMyThread.DoWork;
begin
//Здесь МИНИМУМ - только взаимодействие с VCL
end;
end.
Tutov Roman (2002-06-24 13:08:00) [28]я попробую воспроизвести фрагмент кода .
Анимацию я видимо зря приплел .Как я заметил основная форма (котрая породила тред) замораживается на время выполнения треда .
unit Tread1;
interface
uses
Classes;
type
TMyThread = class(TThread)
private
{ Private declarations }
protected
procedure DoWork;
procedure Execute; override;
end;
implementation
uses klient;
procedure TMyThread.Execute;
begin
Synchronize(DoWork);
end;
procedure TMyThread.DoWork;
begin
{Здесь весь мой код}
end;
end.
А далее как я этот тред запускаю .
T1 := TMyThread.Create(False);
Где собака порылась ?
Юрий Зотов (2002-06-22 13:48:00) [29]Только что воспроизвел у себя Вашу схему (стандартная анимация CopyFile, второй поток крутил бесконечный цикл бессмысленных вычислений). Никаких проблем, все прекрасно нажимается и т.д.
Приоритет дополнительного потока не повышали? Если повышали, причина может быть в этом.
roman_tutov (2002-06-22 13:15:00) [30]именно этот компонент и использую. А код приводить - это ну очень много страничек будет.
Юрий Зотов (2002-06-22 12:38:00) [31]Как можно ответить на такой вопрос, не видя кода? Только предположительно.
Вот я и предполагаю, что цикл перерисовки анимации у Вас сделан ручками и гробит все время CPU, выделяемое основному потоку. Вставьте в него Application.ProcessMessages. Или используйте компонент TAnimation.