Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];

Вниз

Disconnect от TExcelApplication в ПОТОКЕ..   Найти похожие ветки 

 
AAAAA   (2005-02-27 19:35) [0]

Мне ето необходимо, посольку этот самый отконнект происходит оч. долго, и те инструкции, кот.

происходят после него ждут, пока моя прога от него (TExcelApplication) избавится..
Да, и использовать нужно было именно TExcelApplication, а не CreateOleObject..

Код:

//----------------------------------------- просто ф-я, использующая TExcelApplication
Exc:=TExcelApplication.Create(nil);
       try
Exc.Connect;
..
       finally
ExcThread.Create(@Exc); // создаю поток для деструкции TExcelApplication !!!!!!!!!
//Exc.Disconnect; Exc.Quit; FreeAndNil(Exc); // вместо ентого
       end;
..
//-----------------------------------------

Поток:

type
ExcThread = class(TThread)
private
Ppointer:Pointer;
procedure FreeExc;
public
constructor Create(Exc: TExcelApplication);
protected
procedure Execute; override;
end;

{ ExcThread }

constructor ExcThread.Create(Exc: TExcelApplication);
begin
inherited Create(True);      
Ppointer:=@Exc;
Resume;                      
end;

procedure ExcThread.Execute;
begin
 inherited;
  while not Terminated do
    begin
        Synchronize(FreeExc);
        sleep(1);
    end;
end;

procedure ExcThread.FreeExc;
begin
TExcelApplication(Ppointer^).Disconnect;
TExcelApplication(Ppointer^).Quit;
FreeAndNil(TExcelApplication(Ppointer^));
Terminate;
end;

Если без потока, то TExcelApplication успешно выгружается..
Если с потоком, то он тоже успешно появляется, а потом не менее успешно Terminate..

НО: TExcelApplication он из процессов теми же действиями
//Exc.Disconnect; Exc.Quit; FreeAndNil(Exc);

не выгружает..
В чем поблема? Помимо генкода..


 
AAAAA   (2005-02-28 00:07) [1]

Неуж то тока в нем?!..


 
Leonid Troyanovsky ©   (2005-02-28 00:35) [2]


> AAAAA   (28.02.05 00:07) [1]
> Неуж то тока в нем?!..


Если тебя это успокоит, то, возможно, что не только  генетическое, но и .. соматическое.

Э.. вот, расскажи нам подробней, плиз, какая такая нужда в подобном дисконнекте.  Я бы еще согласился на весь (целиком) вызов из вторичного потока. Конечно, with CoInitialize, etc.
Ну, а так, пока, продемонстрированы одни проблемы (читай: ошибки).
Если даже не разбирать целесообразность подобной конструкции:

procedure ExcThread.Execute;
begin
inherited;
 while not Terminated do
   begin
       Synchronize(FreeExc);
       sleep(1);
   end;
end;

которые ничего (кроме Sleep и лишних телодвижений) полезного и не делает.
Пуркуа бы не просто Exc.Quit из первичного потока, а также Exc := nil; (если уж она глобальная).  И что за FreeAndNil?

--
Regards, LVT.


 
sniknik ©   (2005-02-28 01:10) [3]

> И что за FreeAndNil?

SysUtils

procedure FreeAndNil(var Obj);
var
 Temp: TObject;
begin
 Temp := TObject(Obj);
 Pointer(Obj) := nil;
 Temp.Free;
end;


 
Fedia ©   (2005-02-28 01:26) [4]

>sniknik ©   (28.02.05 01:10) [3]
Наверное, имеется в виду, что
FreeAndNil(TExcelApplication(Ppointer^));
не к месту....
Обычно выгружают:
     Excel.Quit;
     Excel:=null;


 
Fedia ©   (2005-02-28 01:35) [5]

Да и без Exc.Disconnect выгрузка из памяти должна прекрасно работать.


 
AAAAA   (2005-02-28 02:43) [6]


> ничего (кроме Sleep и лишних телодвижений) полезного и не
> делает


С потоками я тока сегодня познакомился. И что в такой организации потока не верно?


> расскажи нам подробней, плиз, какая такая нужда в подобном
> дисконнекте


Из экселя считывается инфа, нужная для формирования БД.
пункт 1. считывается инфа из TExcelApplication
пункт 2. формируется БД, тоже из Excel, но по CreateOleObject, на основе инфы из "пункт 1".

Есть необходимость делать это так.

Так вот от "пункт 1" зависит "пункт 2"..
Если даже якоби пункт 1 весь организовать в отдельном потоке (в чем нет необходимости), то

все равно до пункта 2 дело дойдет с задержкой на отконнект от TExcelApplication.

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

от того TExcelApplication...

Да, и..

> Да и без Exc.Disconnect выгрузка из памяти должна прекрасно
> работать.

Знаем, но ето не суть..
Суть в отконнекте (Disconnect или Quit или FreeAndNil - не важно), но параллельно с др.

действиями (пунктом 2), т.е. в отдельном потоке..

Поэтому, где в
AAAAA   (27.02.05 19:35)  
ошибка??

В организации потока? где?
С указателями трабл? где?
Или в том, что чужой (не тот, кто создал это OLE) поток не хочет дисконнектить чужой для него

TExcelApplication??


> Пуркуа бы не просто Exc.Quit из первичного потока, а также
> Exc := nil; (если уж она глобальная).  И что за FreeAndNil?

Какая такая она глобальная? она в функции, выполняющей пункт 1.

Да, и как оказалось, вываливается Access violation при любом из
[Disconnect, Quit или FreeAndNil], выполняемых в потоке см.

> AAAAA   (27.02.05 19:35)  


 
Fedia ©   (2005-02-28 06:20) [7]

>AAAAA   (28.02.05 02:43) [6]
Мне непонятен алгоритм.
>пункт 1. считывается инфа из TExcelApplication
>пункт 2. формируется БД, тоже из Excel, но по CreateOleObject, >на основе инфы из "пункт 1".
После создания экземпляра документа Excel, создается еще один, но другим способом. Для чего? Данные документа из пункта 1 ты используешь для формирования второго документа и сохраняешь его как таблицу БД. Так что-ли?

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

А если выполнять "отконнект" (хотя непонятно почему не просто выгрузку из памяти) после завершения пункта 2 и все выполнять в одном потоке.

В случае, если не хочешь отступать от твоего алгоритма, то попробуй так:
procedure ExcThread.FreeExc;
begin
 CoInitialize(Nil);
 TExcelApplication(Ppointer^).Disconnect;
 TExcelApplication(Ppointer^).Quit;
 FreeAndNil(TExcelApplication(Ppointer^));
 Terminate;
end;


 
AAAAA   (2005-02-28 08:02) [8]


> Мне непонятен алгоритм.
> Данные документа из пункта 1 ты используешь для формирования
> второго документа и сохраняешь его как таблицу БД. Так что-ли?

Не..

Первая функция проверяет документ, считывает первичную инфу..
Она описана в отдельном юните. И как в частности, она возвращает количество строк в документе.
Это ко-во я получаю
WorkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate;
что (как я понял) возможно лишь при работе с реальным TExcelApplication.

Вторая отдельна от первой. Но ждет она от нее это количество..
Эта самая вторая производит считывание и строит БД, для чего не нужно никаких TExcelApplication, а вполне подходит Variant..

Абсрактно:
func2(func1);

Поэтому мне надь отконнективаться (ну или free, не важно) не в funk1, а в funk1 запускать поток для отконнекта..


> CoInitialize(Nil);

Это ничо не изменило.. (
А можно узнать количество строк имея дело с Variant?
Я про CreateOleObject("Excel.Application") ?


 
КаПиБаРа ©   (2005-02-28 08:10) [9]

AAAAA   (28.02.05 8:02) [8]
Поэтому мне надь отконнективаться (ну или free, не важно) не в funk1, а в funk1 запускать поток для отконнекта..


Ты очень далек от истины. Я бы сказал, что ты еще не изучив таблицу умножения ты пытаешься решать интегралы и дифуры.

Даже не знаю что и посоветовать. Читай литературу, побольше эксперементируй.


 
sniknik ©   (2005-02-28 08:23) [10]

> Synchronize(FreeExc);
вот это вот в потоке означает, что код процедуры будет синхронизирован с основным потоком (выполнится в нем).
вот и подумай так ли необходим тебе поток?

> Из экселя считывается инфа, нужная для формирования БД.
> пункт 1. считывается инфа из TExcelApplication
> пункт 2. формируется БД, тоже из Excel, но по CreateOleObject, на основе инфы из "пункт 1".
а вот это наводит на мысль, что все можно сделать гораздо проще, чем через OLE автоматизацию. (возможно и нет, зависит от формируемой базы, но вряд ли)

так простое подключение к ексель файлу как к базе (ADO-Jet) позволит избежать кучи дополнительных компонент/операций/преобразований и как минимум получить данные уже в готовом виде (рекордсете), максимум самостоятельно перенести прямо в базу. (именно данные, ни форматирование ни формулы)
и т.д. а уж насколько быстрее это будет, т.к. никаких запусков екселей, их загрузок/выгрузок...
т.е. код шотя и неверен в принципе, но обсуждения не стоит, лучше обсудить "проблему" в корне чем последствия неверного подхода в неверной же реализации.
(можно только если это для тестов делается, не применительно к задаче а знаний ради)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.036 c
14-1108815099
Просто Джо
2005-02-19 15:11
2005.03.13
Делфи 6 - лицензия


6-1105369923
Константинов
2005-01-10 18:12
2005.03.13
Имитация локальной сети на одном ПК


14-1109014939
тихий вовочка
2005-02-21 22:42
2005.03.13
Корпуса


1-1109494266
Guitar
2005-02-27 11:51
2005.03.13
Цифровая фильтрация сглаживание в примерах Delphi


1-1109667568
Serge_2
2005-03-01 11:59
2005.03.13
StatusBar - прорисовка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский