Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

треды [D5, NT4]


Страницы:   1 2

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.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо