Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.11.09;
Скачать: [xml.tar.bz2];

Вниз

вызов метода в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.005 c
6-1195066750
Алекс_
2007-11-14 21:59
2008.11.09
Номер сокета


2-1222856610
Giga
2008-10-01 14:23
2008.11.09
Загрузка данных в ComboBox


15-1221257410
Rouse_
2008-09-13 02:10
2008.11.09
Официальное обращение к товарищу под ником "Кое Кто"


6-1194968418
artkil
2007-11-13 18:40
2008.11.09
Прокси


15-1221297971
@!!ex
2008-09-13 13:26
2008.11.09
День программиста - Набор стереотипов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский