Вопрос про сетевую многопоточность
Вопрос такой: есть многопоточный сервер который на каждого клиента создает поток, держит соединение и получает от него запросы, все вроде ок, но недавно возникла потребность отсылать определенным клиентам сообщения при каком-то событии в одном потоке (т.е. надо как-то искать потоки по какому-то признаку и через эти потоки слать сообщения).
Я не прошу написать мне готовый код, я просто не знаю как такую штуку лучше сделать...
У меня одна идея: сделать массив элементами которого будут потоки сервера и например по полю userName или userID говорить этому потоку, что он должен послать сообщение клиенту.
Если у вас ест ьидеи на эту тему или вы уже сталкивались э такой задачей напишите пожалуйста.
Правильная идея, только такой массив уже есть.
Его длина SocketServer->Socket->ActiveConnections
элементы SocketServer->Socket->Connections[int Index]. Сделай параллельный массив с параметрами login и шли на клиенты любую информацию.
...
typedef TMyServerThread * MyServerThread;
...
MyServerThread AllThreads[100];
...
void __fastcall TForm1::SSSendFileGetThread(TObject *Sender,
TServerClientWinSocket *ClientSocket,
TServerClientThread *&SocketThread)
{
try
{
AllThreads[cuont++] = new TMyServerThread(false, ClientSocket);
}
catch(...)
{}
Тормозить начинает. Может я не правильно пытаюсь массив ссылок создавать???
Здравствуйте!
Вопрос такой: есть многопоточный сервер который на каждого клиента создает поток, держит соединение и получает от него запросы, все вроде ок, но недавно возникла потребность отсылать определенным клиентам сообщения при каком-то событии в одном потоке (т.е. надо как-то искать потоки по какому-то признаку и через эти потоки слать сообщения).
Я не прошу написать мне готовый код, я просто не знаю как такую штуку лучше сделать...
У меня одна идея: сделать массив элементами которого будут потоки сервера и например по полю userName или userID говорить этому потоку, что он должен послать сообщение клиенту.
Если у вас ест ьидеи на эту тему или вы уже сталкивались э такой задачей напишите пожалуйста.
Наследуя от TClientThread. Отсылать клиентам сообщения можно по запросу клиента.
Пытался создавать массив потоков, но фигня какая-то получается. После этого мой шустрый и стойки сервер превратился в тормоза и паникера, хз почему...
Делал так:
...
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 я его найти не смог.
Я че-то никак не пойму как из моего потока который я создаю на событие GetThread можно получить доступ к другим таким же потокакм, или как это сделать из главной формы...
Пытался создавать массив потоков, но фигня какая-то получается. После этого мой шустрый и стойки сервер превратился в тормоза и паникера, хз почему...
Делал так:
...
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 я его найти не смог.
TCustomWinSocket *Socket)
{
Client = new TClientThreadE(true);
Client->FreeOnTerminate = true;
Socket->OnSocketEvent = Client->OnSocketEvents;
Socket->OnErrorEvent = Client->OnSocketErrorEvents;
Client->Resume();
Socket->Data = Client;
UserCount++;
}
//---------------------------------------------------------------------------
создание клиентского потока. Доступ к другим потокам? В чем его смысл? Можно создавать массивы указателей - только зачем? По сути такой массив и так создается - Connections - если не путаю. Зачем создавать еще дополнительно?
Я просто не догоняю как сделать так, чтобы при получении сообщения в одном потоке сказать определенным, напермер пяти, потокам послать сообщения своим клиентам. А всего коннектов около 500.
Я просто не догоняю как сделать так, чтобы при получении сообщения в одном потоке сказать определенным, напермер пяти, потокам послать сообщения своим клиентам. А всего коннектов около 500.
Создай в этих потоках очередь сообщений.
Создай в этих потоках очередь сообщений.
Все равно не догоняю, зачем очередь сообщений в потоках???
Может очередь сообщений в классе формы, и опрашивать в каждом потоке эту очередь: нет ли там чего для него, но че-то не супер решение помоему.
Все равно не догоняю, зачем очередь сообщений в потоках???
Может очередь сообщений в классе формы, и опрашивать в каждом потоке эту очередь: нет ли там чего для него, но че-то не супер решение помоему.
Сообщение лучше обрабатывать там где оно возникает - а возникает оно в потоке. Затем уже ты можешь обработать его и если надо отправить сообщениие форме о необходимости в каждый коннект слать сообщение.
Сообщение лучше обрабатывать там где оно возникает - а возникает оно в потоке. Затем уже ты можешь обработать его и если надо отправить сообщениие форме о необходимости в каждый коннект слать сообщение.
А, ну да, так и есть, я как раз вопрос задавал о том как этим другим коннектам сказать что им надо послать сообщения. На другом форуме посоветовали сделать массив где для каждого коннекта есль один элемент (как почтовый ящик) и при необходимости туда можно написать сообщение дял определенного потока, и каждый поток периодически смотрит не пришло ли ему что-нибудь, ну и решает там... Но мне кажется это немного не правильный метод, хотя лучше чем ничего.
А, ну да, так и есть, я как раз вопрос задавал о том как этим другим коннектам сказать что им надо послать сообщения. На другом форуме посоветовали сделать массив где для каждого коннекта есль один элемент (как почтовый ящик) и при необходимости туда можно написать сообщение дял определенного потока, и каждый поток периодически смотрит не пришло ли ему что-нибудь, ну и решает там... Но мне кажется это немного не правильный метод, хотя лучше чем ничего.
Зачем создавать еще один пул соединений если вы используете компонент в котором есть свойство Connections? Т.е. массив установленных соединений? Не объясните дураку? :) Просто шоб було? Во втором посте вам об этом написали.
Зачем создавать еще один пул соединений если вы используете компонент в котором есть свойство Connections? Т.е. массив установленных соединений? Не объясните дураку? :) Просто шоб було? Во втором посте вам об этом написали.
Обьясняю еще раз, я бы рад исспользовать уже существующий массив соединений, но вот незадача как ни пытался я выяснить как запомнить номер текущего соединения тиз события GetThread, так и нигде не нашел и никто мне не сказал. Вот и решил раз мне не дают чужие, я пойду играть в свои игрушки.
Обьясняю еще раз, я бы рад исспользовать уже существующий массив соединений, но вот незадача как ни пытался я выяснить как запомнить номер текущего соединения тиз события GetThread, так и нигде не нашел и никто мне не сказал. Вот и решил раз мне не дают чужие, я пойду играть в свои игрушки.
Вселенскую скорбь - понимаю, но не разделяю. При некотором желании пользоваться поиском по форуму решение проблемы находится легко.