Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.11.09;
Скачать: CL | DM;

Вниз

вызов метода в Thread   Найти похожие ветки 

 
Потокер   (2008-10-01 22:23) [0]

Есть класс, заведует отправкой по сети данных. В нем есть поток (потомок Tthread), в этом потоке создается сокет и поддерживается соединение с сервером. Задача класса принять от пользователя данные (в параметре метода, например) и передать их потоку, а поток уже передаст по сети. Будет ли безопасной попыткой просто вызвать метод у потока и просто параметром передать туда данные?
Примерно так:
//в доп потоке
procedure TSomeThread.SendStream(St:TStream);
begin
 FSocket.Send2Network(St);
end;

//некий класс, у которого есть поток
procedure TSomeClass.SendStream(St:TStream);
begin
 FSomeThread.SendStream(St);
end;

//вызываю по кнопочке
SomeClass.SendStream( стрим );


Т.е. например передача данных главному потоку из Execute делается через syncronize, а вот передача "В" поток как синхронизируется?


 
Юрий Зотов ©   (2008-10-01 22:37) [1]

> Будет ли безопасной попыткой просто вызвать метод у потока и просто
> параметром передать туда данные?

Будет. Потому что этот метод будет выполнен в ВЫЗВАВШЕМ потоке. Но это, видимо, не то, что Вы хотели.

> передача "В" поток как синхронизируется?

Например, через TCriticalSection. Описание в справке.


 
Городской Шаман   (2008-10-01 22:38) [2]

Да только поток должен создаватся suspended, передватся данные и потом вызывать resume


 
Сергей М. ©   (2008-10-01 22:52) [3]


> Потокер   (01.10.08 22:23) 


Попытка безопасна всегда.
Опасны результаты действий, вызванных этой самой попыткой.


 
Потокер   (2008-10-01 23:05) [4]


> Будет. Потому что этот метод будет выполнен в ВЫЗВАВШЕМ
> потоке. Но это, видимо, не то, что Вы хотели.

Опишу поподробнее.
У меня сервер видеонаблюдения, помимо самого наблюдения у него есть (будет =) ) функция удаленного просмотра, мне нужно с наименьшими задержками отправлять в сеть видеоданные (потому и держится постоянное соединение, если бы единоразово нужно было - в create передал и забыл). Т.е. в основном потоке работа с сокетом часто вызывает "запинание" (особенно при дисконнекте каком нибудь), перенес сетевую часть в доп.поток. Вот теперь встал вопрос о доставлении данных потоку, создал метод, передаю через него. Нормальный ли это подход?

И второй вопрос, если можно, везде написано, чт окритические секции позволяют работать с переменными, если у меня глобально объявлен класс (var bt:tbutton;), я могу в секции сделать bt.caption:="123";? вылетает АВ, значит крит.секции распространяются только на переменные, но не классы?


 
Eraser ©   (2008-10-01 23:19) [5]

> [4] Потокер   (01.10.08 23:05)

с визуальными/графическими компонентами все таки лучше работать из основного потока. если нужно поменять значение надписи из доп. потока я бы посоветовал вместо метки использовать TStaticText и передавать ему сообщение из доп. потока.


 
Потокер   (2008-10-01 23:48) [6]


> Eraser ©   (01.10.08 23:19) [5]

Пример с кнопкой просто пример, пробывал и с невизуальным классом (обычный class), вызывал у него property, метод вроде SetValue - все равно AV, отсюда и вопрос. (есстественно я создавал экземпляр перед опытами =) ) А в гуглах растиражированные три статьи в огромных количествах.


 
Юрий Зотов ©   (2008-10-02 02:41) [7]

1. Критические секции распространяются не на переменные и не на классы. Они распространяются на код.

2. Схема передачи данных из главного потока может быть примерно такой:

type
 TMyThread  = class(TThread)
 private
   FData: TMyDataPortion;
 protected
   procedure Execute; override;
 public
   property Data: TMyDataPortion read FData write FData;
 end;

procedure TMyThreadExecute;
begin
 while not Terminated do
 begin
   CriticalSection.Enter; // Здесь поток будет ждать порцию данных.
   try
     // Здесь обрабатываем эту порцию данных.
   finally
     CriticalSection.Leave // Сигнализируем, что можно слать следующую.
   end
 end
end;

procedure TForm1.SomeMethod;
begin
 while not EndOfData do
 begin
   CriticalSection.Enter; // Синхронизируемся с потоком
   try
     MyThread.Data := NewDataPortion // Передаем ему порцию данных
   finally
     CriticalSection.Leave // И разрешаем ее обрабатывать
   end
 end;
 MyThread.Terminate
end;


 
Германн ©   (2008-10-02 03:02) [8]

Уроки ЮЗ продолжаются!
Кто-бы что-бы не говорил. :)


 
Сергей М. ©   (2008-10-02 08:30) [9]


> создал метод, передаю через него. Нормальный ли это подход?


Само по себе использование метода для передачи объекту неких параметров нормально.

Ненормальным выглядит вызов SendStream в контексте потока, вызвавшего этот метод.



Страницы: 1 вся ветка

Текущий архив: 2008.11.09;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.011 c
2-1222610739
psp
2008-09-28 18:05
2008.11.09
Как подключить сервер Firebird 1.5. к Delpi 7?.


15-1221573590
star
2008-09-16 17:59
2008.11.09
проблема с сетью


15-1221481634
desc
2008-09-15 16:27
2008.11.09
О открытии сайта


15-1221479303
Запрос
2008-09-15 15:48
2008.11.09
Запрос, максимальная дата


15-1221026764
oldman
2008-09-10 10:06
2008.11.09
Взлетит или не взлетит?