Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
 Аватар для gitarillo
755 / 554 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1

Изоляция процессов друг от друга

27.09.2016, 07:58. Показов 1371. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день всем. Есть небольшая проблема. В моем приложении пользователь генерирует файл Word, вносит какие-то изменения, сохраняет файл, и программа автоматически загружает его сохраненную версию в базу (неважно какую).
Работает следующим образом.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// генерация файла и запуск
void GenFile()
{
 WordApp.Application appWord = new WordApp.Application();
 WordApp.Document docWord = null;
 docWord = appWord.Documents.Open(pathTemp);
.....
docWord.SaveAs2(savePath);
                docWord.Close();
                docWord = null;
                appWord.Quit();
                appWord = null;
 
                System.Diagnostics.Process p = System.Diagnostics.Process.Start(savePath);
                p.EnableRaisingEvents = true;                
                p.Exited += new EventHandler(CloseDoc);
}
// обработчик события закрытия процесса
 private void CloseDoc(object sender, EventArgs e)
        {
            string filePath = ((System.Diagnostics.Process)sender).StartInfo.FileName;
            if (System.IO.File.Exists(filePath))
            {
                try
                {
                    
                    byte[] arr = System.IO.File.ReadAllBytes(filePath);
                  // функционал загрузки в базу
                }
                catch (Exception ex)
                {
                    System.Windows.Forms.MessageBox.Show("Ошибка сохранения в базе файла\n" + ex.Message);
 
                }
 
            }
 
        }
В случае, если работать с одним файлом - все работает прекрасно. Но вот если пользователь запустил из программы сначала один файл, а потом сразу второй, то первый процесс теряется. То есть срабатывает обработчик закрытия процесса, хотя по факту файл закрыт не был. Я думаю можно как-то запускать процесс изолированно друг от друга, или запускать файлы именно в отдельном новом экземпляре приложения ворд. Вопрос как это сделать. Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.09.2016, 07:58
Ответы с готовыми решениями:

Как изолировать друг от друга копии процессов одного приложения?
Привет всем! Есть необходимость запускать приложение в нескольких окнах, однако, само приложение, обнаружив наличие запущенной своей...

Как в PHP отделить элементы друг от друга, чтобы не ругались друг на друга?
<?php $chitat = fopen('yoo.txt', 'r'); if (!$chitat) { echo 'Ошибка при открытии файла yoo.txt'; } while (false !== ($char =...

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

9
71 / 58 / 31
Регистрация: 05.09.2013
Сообщений: 666
27.09.2016, 17:44
Можно попробовать список процессов..
0
 Аватар для gitarillo
755 / 554 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
27.09.2016, 18:01  [ТС]
halk0812, в смысле вести свой список процессов? я правильно понял? При старте процесса добавлять в список только что созданный процесс....Или как?
0
0 / 0 / 2
Регистрация: 18.09.2016
Сообщений: 4
28.09.2016, 06:03
Ну раз уж используется Office.Interop, то можно попробовать копать в таком направлении:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void foo()
{
//...
MsWord.Application app = new MsWord.Application();
app.Visible = true;
//...
object isVisible = true;
MsWord.Document doc = app.Documents.Open(ref file, ref missing, ref readOnly, ref missing, ref missing,
                            ref missing, ref missing, ref missing, ref missing, ref missing, ref missing,
                            ref isVisible, ref missing, ref missing, ref missing, ref missing);
 
app.DocumentBeforeClose += App_DocumentBeforeClose;
}
 
private void App_DocumentBeforeClose(MsWord.Document Doc, ref bool Cancel)
{
//...
}
Для каждого файла можно взять отдельный экземлляр MsWord.Application. Фактически, это и будет отдельный процесс winword.exe. Правда, придется отслеживать закрытие именно того документа, который интересует - но это уже детали.
0
 Аватар для gitarillo
755 / 554 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
28.09.2016, 17:54  [ТС]
Такой способ не подойдет. Ибо сработает перед закрытием документа. А значит файл в данный момент будет занят этим процессом, и я не смогу считать его в байтовый массив.
0
71 / 58 / 31
Регистрация: 05.09.2013
Сообщений: 666
28.09.2016, 17:58
gitarillo, немного отсутствовал. Так список процессов не подошел?)
0
 Аватар для gitarillo
755 / 554 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
28.09.2016, 18:00  [ТС]
Не то чтобы не подошел. Слабо представляю как он мне поможет в данной ситуации. Ведь процесс ликвидирует приложение ворд, а не программа...
0
71 / 58 / 31
Регистрация: 05.09.2013
Сообщений: 666
28.09.2016, 18:02
gitarillo, Ну а пробовали?)
0
 Аватар для gitarillo
755 / 554 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
28.09.2016, 18:16  [ТС]
пробовал. результат тот же. мне кажется задача сводится к запуску вордовского экземпляра каждый раз как отдельного. вопрос как это сделать
0
 Аватар для gitarillo
755 / 554 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
18.10.2016, 09:20  [ТС]
Сделал следующим образом. Создал обработчик отлова закрытия документа для экземпляра приложения. Перед тем, как закрыть документ система сохраняет файл во временной папке, после чего идет загрузка на сервер. Здесь возникла проблема, что отлов идет совершенно всех документов, а не только открытых из моего приложения. Для этого добавил доп проверку, реализовав ее с помощью списка файлов с именами. Теперь все работает корректно. Если кому нужен пример, пишите, размещу здесь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.10.2016, 09:20
Помогаю со студенческими работами здесь

Наложение друг на друга
Добрый день форумчане у меня происходит вот такое с чем это может быть связано?

NPC проваливаются друг в друга
Добрый день! У меня на сцене есть игрок и несколько одинаковых NPC которые тупо следуют за игроком и пытаются его убить. На NPC есть...

2 ПК не достукиваются до друг друга по TCP-IP
Написал простой TCP-IP мессенджер (проект в аттаче). Самому себе (порт приёма и передачи одинаковый, IP 127.0.0.1) пишет хорошо. Два...

Обернуть элементы друг в друга
Здравствуйте. Вроде не сложное задание, но почему-то до сих пор не догоню... Есть html (схематично): <div...

Блоки наезжают друг на друга
Всем привет! Есть страница: http://krls.beta3.ceteralabs.com/. На ней баннер, который под видео, закрывает собой текстовый слайдер...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru