powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ole word зависает.
15 сообщений из 15, страница 1 из 1
Ole word зависает.
    #39828774
RackotPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток господа, очень нужна помощь. И так есть очень страшный legacy проект, в нем реализована печать, с помощью ole.

Всё работает в 99% случаях хорошо. Однако есть алгоритм направляющий на печать по пачке документов.

Примерно вот такой код, приведу пример дабы отсечь многие не верные советы.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
While not is empty so
begin
  word := CreateOleObject('Word.Application');

  ...
  word.ActiveDocument.Close(False);
  word.Quit(1);
end 



Всё бы было ничего, но когда слишком много итераций word может зависнуть (произвольно, при повторе, может все обработать как нужно) и на стадии quit программа просто висит и можно её только убить. Процесс word в свою очередь висит от силы минуты 2 (хотя не должен), но затем умирает, а программа продолжает ждать, пока тот воскреснет. Грешу на антивирус или другое сторонние ПО, которое могло вмешаться.

И так вопрос, как выполнить команду и не ждать word. Решение что приходят на ум это реализовать в потоке или в отдельном приложении, но кастыли не хочу строить, к тому же потоки мне можно сказать не доступны по ряду причин.

Буду рад помощи, заранее спасибо.
...
Рейтинг: 0 / 0
Ole word зависает.
    #39828811
Ghost Writer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обязательно в каждой итерации новый экземпляр word создавать ? можно же в одном открывать/закрывать документы.
...
Рейтинг: 0 / 0
Ole word зависает.
    #39828819
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Quit в OLE Офиса вообще очень странная штука, с Ёкселем в свое время натрахался. В самом деле лучше максимально сократить его использование
...
Рейтинг: 0 / 0
Ole word зависает.
    #39828820
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RackotProРешение что приходят на ум это реализовать в потоке или в отдельном приложении,Не поможет. Все управление все равно передается в однопоточный Word
RackotProБуду рад помощи,Для начала разGhost Writerобязательно в каждой итерации новый экземпляр word создавать ? можно же в одном открывать/закрывать документы.а два - уберите скрытие окна Word и посмотрите, что он делает? Может там диалоговое окно появляется?
...
Рейтинг: 0 / 0
Ole word зависает.
    #39828821
RackotPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ghost Writer, хм... логично, нужно попробовать), но код громоздкий модуль везде используется, очень много правок придется сделать. Но спасибо, за наводку, что-то как-то в голову не приходило)).
...
Рейтинг: 0 / 0
Ole word зависает.
    #39828826
RackotPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_, очень сложно воспроизвести, не всегда удается, у пользователей как назло постоянно, у меня реже. С visible в тру не получилось повторить глюк, может стоит ещё посидеть попытаться.
...
Рейтинг: 0 / 0
Ole word зависает.
    #39828828
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RackotPro,

Код: pascal
1.
2.
3.
4.
ActiveDocument.PrintOut;
DisplayAlerts:=False;
ActiveDocument.Close(wdDoNotSaveChanges);
Quit;
...
Рейтинг: 0 / 0
Ole word зависает.
    #39828836
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cоздавай CreateOleObject + DisplayAlerts := False один раз вне цикла
А в цикле цепляйся к нему GetOleObject
Кстати, Quit нифига не завершает этот Word ( Почему Эксель завершается только после CoUninitialize? ) и в цикле он не нужен
...
Рейтинг: 0 / 0
Ole word зависает.
    #39828856
RackotPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gator, немогу, точнее не хочу, большой легаси проект в нем модуль отвечающий за печать, в нем создание уничтожение из вне вызывается много раз, в итоге править весь проект, а это оооочень много модулей.
...
Рейтинг: 0 / 0
Ole word зависает.
    #39828861
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RackotPro,

Молодой, ленивый... Ну, живи с проблемой или отвяжись от OLE
...
Рейтинг: 0 / 0
Ole word зависает.
    #39828865
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RackotProв нем модуль отвечающий за печать, в нем создание уничтожение из вне вызывается много раз,Т.е. в реальности код такой?
Код: pascal
1.
2.
while ... do
  Print(...)


Где Print это процедура из этого модуля с созданием и удалением?
...
Рейтинг: 0 / 0
Ole word зависает.
    #39828870
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Плохой подход.
- Нужно один раз создать вне цикла
-- В цикле много раз обратиться к созданному
- Освободить в вне цикла ранее сожданное
...
Рейтинг: 0 / 0
Ole word зависает.
    #39828883
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RackotProточнее не хочу
Страдай.
...
Рейтинг: 0 / 0
Ole word зависает.
    #39828885
crossa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Необязательно каждый раз запускать Word заново. Можно попробовать что-то типа этого:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
WordIsRunning := True;
try
   oWord := GetActiveOleObject('Word.Application');
except
   WordIsRunning := False;
   oWord := CreateOleObject('Word.Application');
end;
...
if NOT WordIsRunning then oWord.Quit(1);
...
Рейтинг: 0 / 0
Ole word зависает.
    #39828923
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crossa, Внимательно посмотрел? Какой-такой Quit у ноля?
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ole word зависает.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]