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

Вниз

Обращение из основного потока к дочернему.   Найти похожие ветки 

 
Gear   (2004-08-15 02:01) [0]

Добрый день!
Имеем многопоточный сервер. Каждый поток(процесс) имеет переменную с уникальным идентификатором. Основной процесс, который создал этот дочерний процесс получает данные по сокету, которые маркируются уникальным идентификатором какого-либо дочернего процесса, которому эти данные каким-то образом основной поток должен передать. Вопрос: 1) как обратиться к созданному дочернему процессу и узнать у него значение переменной уникального идентификатора? 2) как передать полученные данные процессу, которому эти данные адресованы согласно уникальному идентификатору.


 
Fay ©   (2004-08-15 02:35) [1]

Храни данные как глобальные, но защити их критической секцией


 
TUser ©   (2004-08-15 02:40) [2]

Прежде всего не понятно о чем ресь - о потоках или все-таки о процессах.


 
Fay ©   (2004-08-15 02:42) [3]

Блин! А я прочитал всё как о потоках 8). Пора на свалку...


 
Gear   (2004-08-15 02:44) [4]

А что возможности хранить данные свои в своём потоке нет? Хочется сделать механизм реализации сессий в сервере. На каждую сессию свой поток со своими переменными, а уже чтобы основной поток передавал конкретному потоку (по id) управляющие данные полученные от клиента инициировавшего сессию (например команда потоку с id=2345, что сессия завершилась).


 
Gear   (2004-08-15 02:47) [5]

Да,прошу прощения, это потоки. Торможу. Под UNIX бычно пишу. Там форкаю новые процессы.Потоки тоже есть, но процессы привычней. Вот сейчас под виндой на Дельфи с терминами погорячился.


 
TUser ©   (2004-08-15 02:53) [6]


> А что возможности хранить данные свои в своём потоке нет?

Да, почему - можно. Создай свойства в своем наследнике TThread"а, и пользуйся.


 
Gear   (2004-08-15 02:58) [7]

Это половина задачи. Как после этого основной поток обратится к дочернему чтобы узнать его свойство id, а так же передать его другим свойствам новые данные?


 
Fay ©   (2004-08-15 02:58) [8]

Можно сделать так (в зависимости от ситуации, конечно)...

Среди прочих событий, поток ожидает некое событие, получив которое, заполняет поля структуры, адрес которой ему передали ещё при инициализации.

Или

Все данные (мз интересуемых) доступны из всех потоков, но обращение защищается крит. секцией.

2TUser ©   (15.08.04 02:53) [6]

Годится только в случае использования TThread-идичей. 8)


 
Fay ©   (2004-08-15 03:00) [9]

2 Gear   (15.08.04 02:58) [7]
Очень странный вопрос. И Id потока, Handle потока изначально знает только вызввающий поток. 8)


 
Gear   (2004-08-15 03:11) [10]

Fay ©   (15.08.04 03:00) [9]
id потока-это свойство которое я назначил при его создании, а не handle. То есть создаю поток а его свойству id (id: string) присваиваю уникальное занчение (id:="IHEB245KJK24lLL"). Потом мне необходимо каким-то образом данные адресованные потоку со значением id:="IHEB245KJK24lLL" передать из основного потока. Как его найти и как ему передать или даже может, как сказать дочернему потоку, что в основной поток пришли данные адресованные тебе, забери их?


 
Fay ©   (2004-08-15 03:19) [11]

2 Gear   (15.08.04 03:11) [10]
HANDLE CreateThread(
 LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
 SIZE_T dwStackSize,                       // initial stack size
 LPTHREAD_START_ROUTINE lpStartAddress,    // thread function
 LPVOID lpParameter,                       // thread argument
 DWORD dwCreationFlags,                    // creation option
 LPDWORD lpThreadId                        // thread identifier
);

Последний параметр - весьма уникатьный идентификатор потока 8).
Чем он не подходит?
И чем не подходят варианты, предложенные ранее? Если что-то не ясно - просто спроси.

З.Ы.
Как именно ты создаёшь потоки?


 
Fay ©   (2004-08-15 03:39) [12]

Ёжик задумался...


 
Юрий Зотов ©   (2004-08-15 07:48) [13]

Если потоки сделаны, как потомки TThread, то кто мешает ввести нужные свойства прямо в класс? Тогда, зная ссылку на экземпляр потока, сразу получаем (или устанавливаем) значения его свойств, а ссылки эти можно хранить, например, в TThreadList (для поиска нужного потока по его ID).

Кстати, зачем назначать свой ID, если у потоков и так уже есть уникальные ID и Handle?


 
Gear   (2004-08-15 12:35) [14]

Потоки сделаны как потомки TThread. Идея примерно понятна. Работа с ссылками. Ссылки хранить в списке.

Свой ID- это необходимый для меня параметр на основании которого должна вестись сессия. Это собственно реализация протокола и его Finite State Machine. Конечно можно тогда сделать соответствие "id потока - моего id".

Почему-то я первый раз слышу о TThreadList :( Есть ли у кого примеры по работе с этим списком?


 
Gear   (2004-08-15 12:40) [15]

To: Fay ©, Юрий Зотов ©

Если не сложно, пожалуйста, приведите небольшой примерчик как решить мою задачу с учётом, что потоки сделаны как потомки TThread?
Зарание спасибо!


 
Юрий Зотов ©   (2004-08-15 15:06) [16]

> Gear (15.08.04 12:40) [15]

interface

type
 TMyThread = class(TThread)
 private
   FID: Integer;
   ... // другие поля
 protected
   procedure Execute; override;
 public
   constructor Create(CreateSuspended: Boolean);
   destructor Destroy; override;
   property ID: Integer read FID write FID;
   ... // другие свойства
 end;

function FindThread(ID: Integer): TMyThread;

implementation

var
 ThreadList: TThreadList;

function FindThread(ID: Integer): TMyThread;
var
 i: Integer;
begin
 Result := nil;
 with ThreadList, LockList do
 try
   for i := 0 to Count - 1 do
     if TMyThread(Items[i]).ID = ID then
     begin
       Result := TMyThread(Items[i]);
       Break
     end
 finally
   UnlockList
 end
end;

constructor TMyThread.Create(CreateSuspended: Boolean);
begin
 inherited;
 ThreadList.Add(Self)
end;

destructor TMyThread.Destroy;
begin
 ThreadList.Remove(Self);
 inherited
end;

initialization
 ThreadList := TThreadList.Create
finalization
 ThreadList.Free
end;


 
KSergey ©   (2004-08-15 20:27) [17]

> Юрий Зотов ©   (15.08.04 15:06) [16]
>  with ThreadList, LockList do

Это написано лишь для вызова метода и чтобы избежать доп. begin/end или я что-то не понял?

Если так - то прикольно %) Зяпятая в Си - привычно, а тут...


 
Юрий Зотов ©   (2004-08-15 21:54) [18]

> KSergey ©   (15.08.04 20:27) [17]

Да, для краткости. LockList и UnlockList относятся к ThreadList, а Count и Items - к LockList.

В общем-то, это обычный прием, если нормально владеть языком. Я довольно часто его использую в тех местах, где от этого не страдает читабельность кода.


 
Gear   (2004-08-16 00:07) [19]

Спасибо мастера. Всё срослось! Премного благодарен.


 
Германн ©   (2004-08-16 02:44) [20]

2 KSergey ©   (15.08.04 20:27) [17]
Неужели ни разу раньше не встречал такую запятую?
По моему - очень часто встречаемая конструкция. Чаще всего, имхо, с компонентами, которые имеют свойство типа TStrings.
Например очень часто удобно работать с конструкцией типа:
with MyComboBox, Items do ...


 
KSergey ©   (2004-08-16 07:15) [21]

> [20] Германн ©   (16.08.04 02:44)
> [18] Юрий Зотов ©   (15.08.04 21:54)

Не, про запятую в with конечно знал. Тут несколько иная находка меня удивила: ведь LockList в данном случае не просто объект, к свойствам которого мы хотим обращаться без дополнительной спецификации (ну может в терминах не очень корректно, но, надеюсь, все поняли), но вызов метода! Т.е. если бы даже не было необходимости в смене области видимости (ой, запутаюсь я в терминах), то сам вызов этого LockList здесь - уже интересен...

Впрочем, это я так, от темы отступил.


 
Юрий Зотов ©   (2004-08-16 11:48) [22]

> KSergey ©   (16.08.04 07:15) [21]

Да, конструкция не часто встречаемая. Но вполне корректная.

with ThreadList, // Здесь область видимости УЖЕ сменилась
                // и никто не запрещает вызвать метод.
    LockList do // Вызвали, получили неявную ссылку на объект
                // и область видимости сменилась еще раз.



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

Форум: "Основная";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.034 c
9-1084221010
Werwolf
2004-05-11 00:30
2004.08.29
Ворпос на засыпку....


3-1091783291
Fynjy
2004-08-06 13:08
2004.08.29
Редактируемый запрос


14-1092229871
Дмитрий12
2004-08-11 17:11
2004.08.29
как запустить компонент панели управления


1-1092401154
}|{yk
2004-08-13 16:45
2004.08.29
Какую директиву компилятора поставить перед


3-1091886312
Koala
2004-08-07 17:45
2004.08.29
Обновить статистику всех индексов





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский