Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопрос про сетевую многопоточность

1.7K
26 мая 2006 года
ilyes
181 / / 22.02.2006
Здравствуйте!

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

Я не прошу написать мне готовый код, я просто не знаю как такую штуку лучше сделать...

У меня одна идея: сделать массив элементами которого будут потоки сервера и например по полю userName или userID говорить этому потоку, что он должен послать сообщение клиенту.

Если у вас ест ьидеи на эту тему или вы уже сталкивались э такой задачей напишите пожалуйста.
13K
26 мая 2006 года
poland
34 / / 16.01.2006
Цитата:
Originally posted by ilyes У меня одна идея: сделать массив элементами которого будут потоки сервера и например по полю userName или userID говорить этому потоку, что он должен послать сообщение клиенту.

Правильная идея, только такой массив уже есть.
Его длина SocketServer->Socket->ActiveConnections
элементы SocketServer->Socket->Connections[int Index]. Сделай параллельный массив с параметрами login и шли на клиенты любую информацию.

1.7K
26 мая 2006 года
ilyes
181 / / 22.02.2006
Да уж, создавать массив потоков - это фигня какая-то, после этого мой шустрый и стойки сервер превратился в тормоза и паникера, хз почему...
Код:
class TMyServerThread :: TServerClientThread
...
typedef TMyServerThread * MyServerThread;
...
MyServerThread AllThreads[100];
...
void __fastcall TForm1::SSSendFileGetThread(TObject *Sender,
      TServerClientWinSocket *ClientSocket,
      TServerClientThread *&SocketThread)
{
try
{
        AllThreads[cuont++] = new TMyServerThread(false, ClientSocket);
}
catch(...)
{}

Тормозить начинает. Может я не правильно пытаюсь массив ссылок создавать???
1
26 мая 2006 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by ilyes
Здравствуйте!

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

Я не прошу написать мне готовый код, я просто не знаю как такую штуку лучше сделать...

У меня одна идея: сделать массив элементами которого будут потоки сервера и например по полю userName или userID говорить этому потоку, что он должен послать сообщение клиенту.

Если у вас ест ьидеи на эту тему или вы уже сталкивались э такой задачей напишите пожалуйста.


Наследуя от TClientThread. Отсылать клиентам сообщения можно по запросу клиента.

1.7K
26 мая 2006 года
ilyes
181 / / 22.02.2006
Я че-то никак не пойму как из моего потока который я создаю на событие GetThread можно получить доступ к другим таким же потокакм, или как это сделать из главной формы...

Пытался создавать массив потоков, но фигня какая-то получается. После этого мой шустрый и стойки сервер превратился в тормоза и паникера, хз почему...
Делал так:
Код:
class TMyServerThread :: TServerClientThread
...
typedef TMyServerThread * MyServerThread;
...
MyServerThread AllThreads[100];
...
void __fastcall TForm1::SSSendFileGetThread(TObject *Sender,
      TServerClientWinSocket *ClientSocket,
      TServerClientThread *&SocketThread)
{
try
{
        AllThreads[cuont++] = new TMyServerThread(false, ClientSocket);
}
catch(...)
{}

Тормозить начинает. Может я не правильно пытаюсь массив ссылок создавать???


Цитата:
...элементы SocketServer->Socket->Connections[int Index]...


Не пойму где этот Index брать, в событии GetThread я его найти не смог.

1
26 мая 2006 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by ilyes
Я че-то никак не пойму как из моего потока который я создаю на событие GetThread можно получить доступ к другим таким же потокакм, или как это сделать из главной формы...

Пытался создавать массив потоков, но фигня какая-то получается. После этого мой шустрый и стойки сервер превратился в тормоза и паникера, хз почему...
Делал так:
Код:
class TMyServerThread :: TServerClientThread
...
typedef TMyServerThread * MyServerThread;
...
MyServerThread AllThreads[100];
...
void __fastcall TForm1::SSSendFileGetThread(TObject *Sender,
      TServerClientWinSocket *ClientSocket,
      TServerClientThread *&SocketThread)
{
try
{
        AllThreads[cuont++] = new TMyServerThread(false, ClientSocket);
}
catch(...)
{}

Тормозить начинает. Может я не правильно пытаюсь массив ссылок создавать???



Не пойму где этот Index брать, в событии GetThread я его найти не смог.


Код:
void __fastcall TfmMain::ssDataClientConnect(TObject *Sender,
      TCustomWinSocket *Socket)
{

  Client = new TClientThreadE(true);
  Client->FreeOnTerminate = true;
  Socket->OnSocketEvent = Client->OnSocketEvents;
  Socket->OnErrorEvent = Client->OnSocketErrorEvents;
  Client->Resume();
  Socket->Data = Client;
  UserCount++;
}
//---------------------------------------------------------------------------

создание клиентского потока. Доступ к другим потокам? В чем его смысл? Можно создавать массивы указателей - только зачем? По сути такой массив и так создается - Connections - если не путаю. Зачем создавать еще дополнительно?
1.7K
29 мая 2006 года
ilyes
181 / / 22.02.2006
Цитата:
Доступ к другим потокам? В чем его смысл?...


Я просто не догоняю как сделать так, чтобы при получении сообщения в одном потоке сказать определенным, напермер пяти, потокам послать сообщения своим клиентам. А всего коннектов около 500.

3
29 мая 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by ilyes
Я просто не догоняю как сделать так, чтобы при получении сообщения в одном потоке сказать определенным, напермер пяти, потокам послать сообщения своим клиентам. А всего коннектов около 500.


Создай в этих потоках очередь сообщений.

1.7K
29 мая 2006 года
ilyes
181 / / 22.02.2006
Цитата:
Originally posted by Green
Создай в этих потоках очередь сообщений.



Все равно не догоняю, зачем очередь сообщений в потоках???

Может очередь сообщений в классе формы, и опрашивать в каждом потоке эту очередь: нет ли там чего для него, но че-то не супер решение помоему.

1
29 мая 2006 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by ilyes
Все равно не догоняю, зачем очередь сообщений в потоках???

Может очередь сообщений в классе формы, и опрашивать в каждом потоке эту очередь: нет ли там чего для него, но че-то не супер решение помоему.


Сообщение лучше обрабатывать там где оно возникает - а возникает оно в потоке. Затем уже ты можешь обработать его и если надо отправить сообщениие форме о необходимости в каждый коннект слать сообщение.

1.7K
29 мая 2006 года
ilyes
181 / / 22.02.2006
Цитата:
Originally posted by kot_
Сообщение лучше обрабатывать там где оно возникает - а возникает оно в потоке. Затем уже ты можешь обработать его и если надо отправить сообщениие форме о необходимости в каждый коннект слать сообщение.


А, ну да, так и есть, я как раз вопрос задавал о том как этим другим коннектам сказать что им надо послать сообщения. На другом форуме посоветовали сделать массив где для каждого коннекта есль один элемент (как почтовый ящик) и при необходимости туда можно написать сообщение дял определенного потока, и каждый поток периодически смотрит не пришло ли ему что-нибудь, ну и решает там... Но мне кажется это немного не правильный метод, хотя лучше чем ничего.

1
29 мая 2006 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by ilyes
А, ну да, так и есть, я как раз вопрос задавал о том как этим другим коннектам сказать что им надо послать сообщения. На другом форуме посоветовали сделать массив где для каждого коннекта есль один элемент (как почтовый ящик) и при необходимости туда можно написать сообщение дял определенного потока, и каждый поток периодически смотрит не пришло ли ему что-нибудь, ну и решает там... Но мне кажется это немного не правильный метод, хотя лучше чем ничего.


Зачем создавать еще один пул соединений если вы используете компонент в котором есть свойство Connections? Т.е. массив установленных соединений? Не объясните дураку? :) Просто шоб було? Во втором посте вам об этом написали.

1.7K
30 мая 2006 года
ilyes
181 / / 22.02.2006
Цитата:
Originally posted by kot_
Зачем создавать еще один пул соединений если вы используете компонент в котором есть свойство Connections? Т.е. массив установленных соединений? Не объясните дураку? :) Просто шоб було? Во втором посте вам об этом написали.



Обьясняю еще раз, я бы рад исспользовать уже существующий массив соединений, но вот незадача как ни пытался я выяснить как запомнить номер текущего соединения тиз события GetThread, так и нигде не нашел и никто мне не сказал. Вот и решил раз мне не дают чужие, я пойду играть в свои игрушки.

1
30 мая 2006 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by ilyes
Обьясняю еще раз, я бы рад исспользовать уже существующий массив соединений, но вот незадача как ни пытался я выяснить как запомнить номер текущего соединения тиз события GetThread, так и нигде не нашел и никто мне не сказал. Вот и решил раз мне не дают чужие, я пойду играть в свои игрушки.


Вселенскую скорбь - понимаю, но не разделяю. При некотором желании пользоваться поиском по форуму решение проблемы находится легко.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог