Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Процессы  (Прочитано 7229 раз)
0 Пользователей и 1 Гость смотрят эту тему.
flare
Гость
« : 08-12-2003 07:46 » 

Каким образом дочерний процесс, сохранивший файл на диске, может передать родителю полный путь к этому файлу?
(возможно этих файлов будет много)
Записан
Serega
Гость
« Ответ #1 : 08-12-2003 08:06 » 

Присоздании процесса передавай ему адрес хранилища, а лучше инкапсулировать в команду
Записан
flare
Гость
« Ответ #2 : 09-12-2003 07:42 » 

не очень понятно
адрес хранилища - хранилища чего, файлов?
инкапсулировать в команду - что?
Записан
Sommer
Молодой специалист

us
Offline Offline

« Ответ #3 : 09-12-2003 08:01 » 

Цитата: flare
адрес хранилища - хранилища чего, файлов?

думаю речь шла о том, чтобы процессу передать указатель на строку в которой бы хранился адрес файла..
Записан

когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины.
но тогда меня уже не будет
в этом городе
forever yours.
Serega
Гость
« Ответ #4 : 09-12-2003 09:47 » 

Имелось ввиду вот что:
Родительский процесс создает у себя хранилище строчек с путями.
При создании дочернего процесса ему передается адрес этого хранилища, куда он и будет добавлять строки.
Более гибкий вариант это инкапсулировать работу по добавлению строки в команду - обьект, который будет знать куда и как ее добавить, и передавать дочернему процессу эту команду.

Вариант 1:
Код:
typedef std::vector<std::string> string_container;

class ChildProcess
{
string_container& container;
public:
ChildProcess(string_container& cont) : container(cont) {}
void run()
{
std::string str;
//...
container.push_back(str);
//...
delete this;
}
};

class MainProcess
{
string_container strings;
public:
void run()
{
//...
ChildProcess* proc = new ChildProcess(strings);
proc->run();
//...
}
};

Вариант 2:
Код:
typedef std::vector<std::string> string_container;

class Command
{
public:
virtual ~Command() {}
virtual void doIt(std::string str) = 0;
};

class ChildProcess
{
std::auto_ptr<Command> command;
public:
ChildProcess(Command* cmd) : command(cmd) {}
void run()
{
std::string str;
//...
command->doIt(str);
//...
delete this;
}
};

class Mutex
{
public:
void Lock() { /*...*/ }
void UnLock() { /*...*/ }
};

class AddStringSynchronized : public Command
{
string_container& container;
Mutex& mutex;
public:
AddStringSynchronized(string_container& cont, Mutex& m)
: container(cont), mutex(m)
{}
void doIt(std::string str)
{
mutex.Lock();
container.push_back(str);
mutex.UnLock();
}
};

class MainProcess
{
string_container strings;
Mutex synchronizer;
public:
void run()
{
//...
ChildProcess* proc = new ChildProcess(new AddStringSynchronized( strings, synchronizer ));
proc->run();
//...
}
};

Преимущество второго варианта в том, что мы можем создавать произвольные команды, не изменяя код дочернего процесса
« Последнее редактирование: 23-11-2007 15:40 от Алексей1153++ » Записан
flare
Гость
« Ответ #5 : 09-12-2003 18:20 » 

Круто!!!
спасибо!!!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines