| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Системное программирование > Клонирование процесса Perl/Tk+Win32 |
| Автор: Гость_antony 30.8.2005, 14:14 | ||
| Есть проблема. При работе под Win32 с использованием Tk надо создать копию текущего процесса в асинхронном режиме. fork() под виндой не работает, и вызывает системную ошибку. Win32::Process::Create работать не хочет по непонятным причинам. Пытаюсь сделать примерно следующее:
Вызывается все это из уже запущенного процесса. Что еще для счастья надо? |
| Автор: sharq 30.8.2005, 17:25 | ||
Гость_antony я не знаю, что ты хочешь с помощью этого сделать, но читать документацию надо внимательно.
Зачем три темы было создавать? |
| Автор: Usya 31.8.2005, 07:18 | ||||||
Кто сказал? Работает. Правда не всегда. Когда то сам наткнулся на это:
Правда где-то читал, что Microsoft вроде бы обращалась с просьбой на счет исправления некоторых глюков. Может желтая пресса, но пока то, что есть. Кстати, можешь попробовать это
Сравни время начала и конца обоих процессов |
| Автор: smth 31.8.2005, 11:53 | ||
| sharq, большой разницы в коде я не вижу. В твоем коде явно указана подпрограмма обработки ошибки, а у меня нет. Вот, практически, и все. Если есть КОНКРЕТНЫЕ замечания/предложения - обсудим! На самом деле, если в качестве параметров прописать какой-нить Notepad, то код работает. Вообще похоже на то, что с этой самой Tk Win32::Process не может создать второй процесс, ибо считает, что он дублируется. Почему? Как можно динамически выделить уникальный ID процессу? В некоторых примерах от CPAN при создании процесса применяется следующая конструкция:
и т.д. Здесь, насколько я понимаю, ProcessObj создает объект для текущего процесса, если его не было - хотя может быть я и ошибаюсь. Хотелось бы разобраться получше. Три сообщения это глюки експловера Usya спаибо за совет, только fork() вызывает системную ошибку, во всяком случае у меня на компе |
| Автор: sharq 31.8.2005, 15:12 |
| smth разница в подключение модуля Win32. Запусти этот код, он рабочий, открывается командный интерпретатор perl. Только за чем тебе это. Лучше скажи, что тебе нужно. |
| Автор: smth 31.8.2005, 15:23 |
| sharq! Блин! Мне не нужен интерпритатор! Мне нужна КОПИЯ ТЕКУЩЕГО ПРОЦЕССА! Задача: написать мультиплатформенное приложение на перле с использованием интерфейса пользователя, т.е. модуля Tk. Это самое приложение должно иметь возможность открытия еще одной рабочей области, являющейся копией родительской. При этом оба созданных приложения дожны работать независимо друг от друга (наподобии "File/New->Window" в IE). Для решения данной задачи необходимо создать копию текущего процесса, что можно осуществить или вызовом fork() (который не работает под Win32) или использованием библиотеки Win32. |
| Автор: sharq 2.9.2005, 00:23 | ||||||
smth
Тогда зачем ты используешь модуль Win32?
Приведи код и ошибку. |
| Автор: Usya 2.9.2005, 01:14 |
| smth, а ты не пробовал работать с потоками? Если нет, посмотри документацию к модулю threads и соответствующие примеры. |
| Автор: smth 2.9.2005, 08:29 | ||||
sharq
Потому что я могу динамически отпределить, в какой OS нахожусь. И, соответсвенно, юзать те или иные модули.
Винда убивает перловый процесс напрочь. При этом выкидывается стандартная тряпочка с предложением послать код ошибки в microsoft. Получить код ошибки от перла не получается. Usya Я задумывался над этим. В принципе, если не создавать копию процесса, а запускать новый поток и в нем уже запустить совершенно новый процесс - может и выгорит. Только мне уже из принципа интересно, почему не работают стандартные функции |
| Автор: Usya 2.9.2005, 09:21 | ||||
| Стоп! Я сам, правда с потоками не работал, только с процессами экспериментировал, поэтому кое-что могу и сам сморозить, но кажется ты немного путаешь понятия процесса и потока. На одном из сайтов видел это (правда было написано для Javi, но в данном случае думаю без разницы)
А с этим
действительно надо разбираться |
| Автор: sharq 2.9.2005, 09:52 | ||||
smth
Не самый лучший вариант... но если по другому нельзя...
Привиде код скрипта! Интересно, что ты там написал. |
| Автор: smth 2.9.2005, 10:36 |
| sharq Что имено тебя интересует? Скрипт? Там более 600 отлаженных строк в общей сложности. Как вызывается fork()? fork() || die "Cannot fork() $!"; Как вызывается Win32::Process::Create? См. выше. Как запускается под виндой скрипт с Tk? Смотри мануал. Что еще? Usya Согласен. Только мне никто и ничто не мешает создать новый процесс в отдельном трэде. Причем этот процесс будет изолирован от друго такого же полностью. Т.е. сначала создаем "оболочку". В этой оболочке нет ничего, кроме создания и управления потоками. При запуске для этой "оболочки" будет создан процесс. Если дочерних процессов (потоков) нет, создается отдельный поток, в котором запускается еще один процесс, выполняющий то, что нам нужно. Если появится необходимость создать еще один процесс, то из "оболочки" создаем еще один поток и - вуаля! - у нас два независимых потока с независимыми процессами. |
| Автор: sharq 2.9.2005, 11:48 | ||||
Мне все равно, у тебя же не работает!
Ух ты, что прада именно так? |
| Автор: smth 2.9.2005, 14:12 |
| sharq Если все равно, зачем спрашивать? |
| Автор: smth 10.11.2005, 19:44 | ||
|
| Автор: sharq 11.11.2005, 12:01 |
| Для Windows все-таки корректно использовать threads! |
| Автор: smth 11.11.2005, 13:06 |
| Может быть. Только таким образом одна и таже строка работает и под линухом, и под виндой |
| Автор: sharq 11.11.2005, 22:51 | ||
smth
Привиди пример, интересно посмотреть. Добавлено @ 22:54 Только не как в прошлый раз. |
| Автор: smth 28.11.2005, 14:07 | ||
А как? |
| Автор: sharq 28.11.2005, 15:14 | ||
Мне действительно интересно посмотреть, как ты реализовал это, приведи листинг кода, плиз. |
| Автор: smth 28.11.2005, 17:31 | ||||
весь код большой. Основоной смысл в следующем: все платформо зависимые операции встявляются под условие. Например:
если запустить этот код на линухе, будет выведено "This is a Linux!", а если под виндой - "This is a Windows!" Строка типа
Работает одинаково на всех платформах. P.S. Про ось не уверен, не пробовал... |
| Автор: sharq 28.11.2005, 18:22 |
| smth это и так понятно, я просил про клонирование процессов. |
| Автор: smth 28.11.2005, 18:47 |
| Так system и есть клонирование! Если после имени запускаемого скрипта поставить амперсанд, то система не будет ждать окончания работы запущенной проги. Хотя при вызове запускаемая программа будет наследовать все параметры запускающей. А вообще забей. Перл есть Перл! Нельзя сделать только то, что нельзя придумать! |