2012-01-23 3 views
4

У меня есть рабочее серверное/клиентское приложение с использованием распределенных объектов в объекте-c. То, с чем я сейчас борюсь, делает приложение многопоточным. Так что больше пользователей может одновременно получить доступ к серверу.Распределенные объекты, Threading, Objective-C

Здесь главная функция для сервера. Здесь я создаю объект nsconnection.

С моей точки зрения, способ, которым я должен подходить к этому, - это когда пользователь пытается получить доступ к серверу, для этого конкретного вызова должен быть назначен новый поток. Должен ли [conn runInNewThread] позаботиться об этом?

Любые мысли Ценится ...

Вот код для сервера.

int main (void) 
{ 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

Transactions *trans = [Transactions new]; 
NSConnection *conn = [NSConnection defaultConnection];   
[conn setRootObject: trans]; 
[conn runInNewThread]; 

if (![conn registerName:@"holycow"]) 
{ 
    NSLog (@"Failed registering holycow."); 
    exit (1); 
} 

NSLog (@"waiting for connections..."); 
[[NSRunLoop currentRunLoop] run]; 

[pool release]; 
return 0; 
} 

ответ

0

Для того, чтобы ответить на сообщения клиента, реагирующий объект сервера должен быть установлен как «корневым объект» из экземпляра класса NSConnection, которое, и это соединение NSConnection должен быть зарегистрирован в сети по имя.

Так что в случае Distributed object, один серверный объект может обрабатывать несколько клиентов. или вы можете создать больше объектов сервера и разделить своих клиентов.

+0

Это, кажется, имеет место для меня. Я мог иметь два клиентских приложения, которые вызывают синхронное (что означает, что я не использовал метод класса «oneway») по сравнению с DO в одно и то же время. Это было похоже на то, что оно автоматически зацикливалось на нем. Это было немного медленнее, потому что, ну, сервер был занят чем-то трудным, но когда я дал ему секунду, сервер ответил, пока он обрабатывал другую задачу одновременно. Однако я бы рекомендовал, чтобы кодеры делали что-то вроде запуска задачи с помощью метода oneway (async), а затем проверяли его с помощью метода синхронизации, который выполняется быстро. – Volomike

0

@Parag Bafna был прав в своем ответе, когда я проверил тест. Однако я использовал особый вид архитектуры на сервере, который мог бы помочь в этом. Возьмем, например, команду, которая занимает много времени для запуска на сервере. Это может повесить сервер немного и сделать его намного медленнее для подключений, которые нужно обработать. Вот мое решение.

  1. Попросите клиента вызвать метод асинхронного класса, используя свойство oneway. Назовем это runProcess.

  2. Сделайте runProcess в задаче popen() и сохраните PID как глобальную переменную.

  3. Затем используйте performSelectorInBackground для запуска метода синхронного класса под названием readProcess в фоновом режиме.

  4. В readProcess я использую while(fgets(buff, sizeof(buff), ghPID)!=NULL) читать ранее установленный popen() вывод (обратите внимание на глобальную переменную, ghPID) и добавить последнюю строку читать в глобальную переменную из последних строк читать. Этот метод работает как фоновая задача, и клиент уже отключен от runProcess.

  5. Теперь подключите клиент к методу синхронного класса, который называется getProcessData. Затем это должно занять глобальную переменную последних строк и вернуть ее обратно. Так как это не занимает много времени, клиент довольно быстро отключается от этого метода класса.

  6. Клиент может затем опросить эти данные, пока не узнает, что это сделано. Чтобы помочь в этом, вы можете создать синхронный метод с именем isProcessRunning, который может проверять глобальную логическую переменную на демоне сервера с именем gbRunning и возвращать true/false.Конечно же, вам придется перевернуть эту переменную на сервере daemon true/false в различных методах класса, когда сервер занят заданием popen().

Делая это так, ваш серверный демон может быстрее реагировать на параллельные запросы.

Дополнительным советом будет использование файла kill или другого механизма (разделяемая память? SIGHUP?), Так что если вы находитесь в цикле while и хотите остановить этот процесс, вы можете просто удалить файл kill где-нибудь в/tmp, и процесс будет использовать pclose, чтобы убить его, а затем удалить файл kill. Я также делаю это до начала процесса, если хочу, чтобы только один конкретный процесс выполнялся одновременно с этим демоном сервера.

Смежные вопросы