Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Время жизни ActiveX EXE'шников / 25 сообщений из 27, страница 1 из 2
19.08.2004, 11:14:19
    #32656227
MegaDimon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время жизни ActiveX EXE'шников
Подскажите пожалуйста как можно управлять временем жизни ActiveX EXEэшника написанном на VB? Тоесть мне необходимо чтобы сам EXEэшник никогда не выгружался из памяти, даже если на него не ссылается ни один клиент.
...
Рейтинг: 0 / 0
19.08.2004, 12:30:46
    #32656493
raur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время жизни ActiveX EXE'шников
а зачем? непонятно...
...
Рейтинг: 0 / 0
19.08.2004, 12:40:26
    #32656523
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время жизни ActiveX EXE'шников
Дык он и не выгрузится... Это ж exe, а не dll
Word или Excel тоже ActiveX exe, пока им не сделаешь Application.Quit, они будут висеть в памяти и жрать ее большими ложками.
...
Рейтинг: 0 / 0
19.08.2004, 12:41:30
    #32656525
Alexey Kudinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время жизни ActiveX EXE'шников
MegaDimonПодскажите пожалуйста как можно управлять временем жизни ActiveX EXEэшника написанном на VB? Тоесть мне необходимо чтобы сам EXEэшник никогда не выгружался из памяти, даже если на него не ссылается ни один клиент.

:) Обычно проблема состоит в обратном: как выгрузить ActiveX EXE из памяти, если с клиентом что-то случилось.
Управление жизнью ActiveX EXE-шника у MS организовано из рук вон плохо. Это они сами подчеркивают постоянно в сравнениях DCOM vs Remoting
Грубо говоря, чтобы сделать то, что Вам нужно Вам придется "пристреливать" клиентов каким-то особым способом, чтобы они не успевали освободить ссылку. Но это... сами понимаете.

П.э. возможно Вам лучше написать например Win сервис, к-й постоянно держал бы в себе ссылку на ActiveX EXE.
...
Рейтинг: 0 / 0
19.08.2004, 12:49:49
    #32656563
MegaDimon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время жизни ActiveX EXE'шников
For Alexey Kudinov
идея насчет сервиса с ссылкой на компонент мнен понравилась! Thanks ;)

For Antonariy
Еще как выгрузиться! Только последний клиент отключается и тутже вылетает.

For raur
Сервер помимо предоставления интерфейсов клиентам еще выполняет другие функции по сбору и обработке информации. Клиенты подключаютя через DCOM только для просмотра данных накопленных сервером и задание настроек.
...
Рейтинг: 0 / 0
19.08.2004, 13:09:30
    #32656628
raur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время жизни ActiveX EXE'шников
а зачем держать его в памяти?
...
Рейтинг: 0 / 0
19.08.2004, 13:50:16
    #32656765
MegaDimon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время жизни ActiveX EXE'шников
чтобы он работал. Если клиентов нет он все равно должен собирать информацию и в базу данных ее пихать.
...
Рейтинг: 0 / 0
19.08.2004, 14:18:23
    #32656862
raur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время жизни ActiveX EXE'шников
тогда тебе надо написать что-либо, что вызвало-бы нужные методы и поставить в автозагр. и vb.hide ...
а какая операционка у тебя о птичках?
...
Рейтинг: 0 / 0
20.08.2004, 11:47:40
    #32658538
MegaDimon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время жизни ActiveX EXE'шников
Система Windows2000, чтобы уомпонент не выгружался я сделал как ты говориш прогу которая постоянно на него ссылается. Идея была хорошая.

У меня такой вопрос, как можно сделать чтобы каждый клиент создавая объект компонента получал один и тотже экземпляр объекта. Т.е. нужно чтобы все клиенты работали с одним экземпляром класса, а не порождали новые.
...
Рейтинг: 0 / 0
20.08.2004, 13:47:09
    #32658948
Alexey Kudinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время жизни ActiveX EXE'шников
MegaDimon
У меня такой вопрос, как можно сделать чтобы каждый клиент создавая объект компонента получал один и тотже экземпляр объекта. Т.е. нужно чтобы все клиенты работали с одним экземпляром класса, а не порождали новые.

Singleton хотите сэмулировать ?
По простому не выйдет.
По сложному:
1 - на сервере создается 1 экземпляр какого-то класса
2 - клиенты получают к нему доступ ч-з фабрику классов, т.е. через методы, дающие доступ к этому экземпляру
Пример

Почитайте пример, обратите внимание на Bug, который там описан.
Добавлю, что Вы конечно должны очень аккуратно разрабатывать свой Shared класс. Т.е. помнить, что он именно Shared, поэтому никаких флагов, помнить про блокировку ресурсов, помнить, что клиенты могут "умереть" и т.п. Очень, очень аккуратно.

В заключение - почитайте про Instancing и Threading в ActiveX EXE. При разработке такого рода проектов эти параметры очень влияют.
...
Рейтинг: 0 / 0
20.08.2004, 15:32:38
    #32659353
MegaDimon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время жизни ActiveX EXE'шников
Alexey огромное спасибо за ответ и ссылку на пример!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
31.08.2005, 10:54:46
    #33242803
Serg841
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время жизни ActiveX EXE'шников
AntonariyДык он и не выгрузится... Это ж exe, а не dll
Word или Excel тоже ActiveX exe, пока им не сделаешь Application.Quit, они будут висеть в памяти и жрать ее большими ложками.
А вот как раз возникла проблема чтобы выгрузить приложение Excel.
Application.quit не помогает :(
...
Рейтинг: 0 / 0
31.08.2005, 12:42:34
    #33243212
Время жизни ActiveX EXE'шников
MegaDimonСистема Windows2000, чтобы уомпонент не выгружался я сделал как ты говориш прогу которая постоянно на него ссылается. Идея была хорошая.

У меня такой вопрос, как можно сделать чтобы каждый клиент создавая объект компонента получал один и тотже экземпляр объекта. Т.е. нужно чтобы все клиенты работали с одним экземпляром класса, а не порождали новые.

допустим - получилось. (ЕXE и т.д.)

аднака панятна ли, что пока один дернул такой класс за метод,
все остальные клиенты обязаны ждать. и не могут дотронутся до такого объекта.
то есть дотронутся могут, но либо ждать будут, либо отвалятся п о таймауту.
Понимаете ли Вы, что создаете общесистемное узкое горло?

(Видел таку бяку от пропессианальных прогряммиздов - м#%*чье таким
способом через один коннект к базе работало. Песня просто, картина Репина
-сервер базы прохлаждается, "компонент" трудится, юзера матерятся. )

Если понимаете - вперед за дело.

1) Создать ActiveX.Exe проект. поставить Thread Pool=1.
Startup Object=Sub Main

2) Завести PublicMultiUse класс, функциями которого будете
возвращать экземпляр класса ЛюбимыйИЕдинственныйНаВсех, который реализует интерфейс IЛюбимыйИЕдинственныйНаВсех
3) создаете PublicNotCreatable класс с именем IЛюбимыйИЕдинственныйНаВсех
4)Создаете MultiUse класс RЛюбимыйИЕдинственныйНаВсех
5) В стандартном модуле заводите (глобальную) переменную уровня модуля
типа IЛюбимыйИЕдинственныйНаВсех
В Sub Main формируете экземпляр RЛюбимыйИЕдинственныйНаВсех
и сохраняете в переменную модуля



То есть пальцев пять и все об асфальт.
...
Рейтинг: 0 / 0
31.08.2005, 13:24:44
    #33243353
Время жизни ActiveX EXE'шников
RЛюбимыйИЕдинственныйНаВсех - он Private
...
Рейтинг: 0 / 0
31.08.2005, 13:40:22
    #33243402
Дурак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время жизни ActiveX EXE'шников
глупыйглупый
...


Ржунимагу... :-)))
...
Рейтинг: 0 / 0
31.08.2005, 14:27:08
    #33243560
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время жизни ActiveX EXE'шников
авторА вот как раз возникла проблема чтобы выгрузить приложение Excel.
Application.quit не помогает :(
Бывает. С чем связано не знаю.
Нужно внимательно посмотреть, не осталось ли ссылок на само приложение или какие нибудь его объекты. Полезно так же закрыть все документы, после чего сделать Quit.
...
Рейтинг: 0 / 0
31.08.2005, 16:14:56
    #33243893
Serg841
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время жизни ActiveX EXE'шников
Antonariy авторА вот как раз возникла проблема чтобы выгрузить приложение Excel.
Application.quit не помогает :(
Бывает. С чем связано не знаю.
Нужно внимательно посмотреть, не осталось ли ссылок на само приложение или какие нибудь его объекты. Полезно так же закрыть все документы, после чего сделать Quit.
Если просто использую это приложение, то все закрывается и выгружается из памяти. Но когда я его используя для вставки данных в Access, то никак не хочет выгружать приложение Excel. Привожу фрагмент кода
Код: plaintext
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.
Dim xlApp As Object     
Dim xlWkb As Object     

smdbname = "D:\proba.mdb"
f_name = "Dan_009"

Set conn = CreateObject("ADODB.Connection")
conn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & smdbname & ";User ID=Admin;Password=;Extended Properties=")

Set xlApp = GetObject("", "Excel.Application")
Set xlWkb = xlApp.workbooks.Open("D:\Dan_009.xls")

For i =  1  To xlWkb.sheets.Count
    If InStr(LCase(xlWkb.sheets(i).Name), LCase("prep")) <>  0  Then
        xlname = xlWkb.sheets(i).Name
    End If
Next i

On Error Resume Next
   conn.Execute "create table " & f_name & " (summa double, prep char (255), klass char(255)," & _
             "uid double, ne_l char(255), drug char(255), form char(255), id_divider double)"

SQL = "INSERT INTO " & f_name & " IN '" & smdbname & "' " & _
      "SELECT summa,prep,klass,uid,ne_l,drug,form,id_divider " & _
      "FROM [" & xlname & "$] IN 'D:\Dan_009.xls'[EXCEL 8.0;HDR=yes;IMEX=1];"
      conn.Execute SQL, , adExecuteNoRecords

xlApp.workbooks.Close
xlApp.quit
Set xlApp = Nothing
conn.Close
Set conn = Nothing
MsgBox "Данные скопированы!"
...
Рейтинг: 0 / 0
31.08.2005, 16:40:40
    #33243991
Время жизни ActiveX EXE'шников
переставь conn.Close
до
xlApp.workbooks.Close
xlApp.quit
Set xlApp = Nothing

скорее всего поможет.
а на вопрос "почему" - тебе уже Antonariy ответил.
в данном случае неявно.
...
Рейтинг: 0 / 0
31.08.2005, 17:57:23
    #33244277
Serg841
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время жизни ActiveX EXE'шников
глупыйглупыйпереставь conn.Close
до
xlApp.workbooks.Close
xlApp.quit
Set xlApp = Nothing

скорее всего поможет.
а на вопрос "почему" - тебе уже Antonariy ответил.
в данном случае неявно.
Ничего не изменилось, приложение по-прежнему в памяти. Выгружается только после закрытия Visual Basic.
...
Рейтинг: 0 / 0
31.08.2005, 18:02:38
    #33244293
Melkiades
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время жизни ActiveX EXE'шников
А если On Error Resume Next убрать, на что ругается?
...
Рейтинг: 0 / 0
31.08.2005, 18:05:44
    #33244298
Время жизни ActiveX EXE'шников
Serg841 глупыйглупыйпереставь conn.Close
до
xlApp.workbooks.Close
xlApp.quit
Set xlApp = Nothing

скорее всего поможет.
а на вопрос "почему" - тебе уже Antonariy ответил.
в данном случае неявно.
Ничего не изменилось, приложение по-прежнему в памяти. Выгружается только после закрытия Visual Basic.

(Set conn = Nothing - дотянул туда же?)

значит дело не в этом куске. Какие-то куски есть еще с поброшенными явными или неявными объектными ссылками.

шерсти код.
...
Рейтинг: 0 / 0
01.09.2005, 09:22:23
    #33244927
Serg841
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время жизни ActiveX EXE'шников
MelkiadesА если On Error Resume Next убрать, на что ругается?
Если таблица в аксесе уже существует, то выдает ошибку
On Error Resume Next позволяет ее избежать
глупыйглупый
(Set conn = Nothing - дотянул туда же?)

значит дело не в этом куске. Какие-то куски есть еще с поброшенными явными или неявными объектными ссылками.

шерсти код.
Set conn = Nothing тоже поставил, без изменений.
Весь код я выложил, больше никаких кусков нет.
Наверное при выполнении sql-запроса книга все равно остается в памяти.
...
Рейтинг: 0 / 0
01.09.2005, 09:30:16
    #33244946
Melkiades
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время жизни ActiveX EXE'шников
Serg841
Set conn = Nothing тоже поставил, без изменений.
Весь код я выложил, больше никаких кусков нет.
Наверное при выполнении sql-запроса книга все равно остается в памяти.
Такое ощущение, что Excel удерживает у себя ссылку на Access.
...
Рейтинг: 0 / 0
01.09.2005, 09:47:08
    #33245002
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время жизни ActiveX EXE'шников
AntonariyНужно внимательно посмотреть, не осталось ли ссылок на само приложение или какие нибудь его объекты.

Set xlWkb = xlApp.workbooks.Open("D:\Dan_009.xls")

Убить в nothing!
...
Рейтинг: 0 / 0
01.09.2005, 11:04:40
    #33245253
Serg841
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время жизни ActiveX EXE'шников
Antonariy AntonariyНужно внимательно посмотреть, не осталось ли ссылок на само приложение или какие нибудь его объекты.

Set xlWkb = xlApp.workbooks.Open("D:\Dan_009.xls")

Убить в nothing!
Не помогло. Дело в том, что если не использовать Access, т.е. только Excel то
Код: plaintext
1.
2.
xlApp.application.quit
Set xlApp = Nothing
достаточно чтобы убить приложения.

Так что думаю дело не в других ссылках, а в Access, т.е. во взаимосвязи с ним Excel.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Время жизни ActiveX EXE'шников / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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