Показать сообщение отдельно
  #6  
Старый 12.01.2008, 13:21
~ SaM ~ ~ SaM ~ вне форума
Начинающий
 
Регистрация: 05.01.2007
Адрес: Днепропетровск
Сообщения: 141
Репутация: 25
По умолчанию

to ART

Да, я с тобой согласен, что процедура/функция не будет работать быстрее из-за того, что она будет выполняться в отдельном протоке! Но!!! Вопрос ведь заключается в другом... У меня таких процедур(практически с одинаковой структурой) пока только 13, а в конечном итоге должно быть от 20 до 30. И ведь если все эти процедуры будут выполняться через COM в многопоточности(Multithreaded(MTA)), то это существенно увеличит время выполнения.

Ломал я голову, лазил по инэту и нашел интересную статейку, в которой расказывается про однопоточность и многопоточность... В ней рассказывается, что при работе с COM (с потоками) необходимо инициализировать отдельный поток, т.к. COM по умолчанию(да и Delphi нас снабжает модулем ComObj.pas, который позволяет работать только в однопоточном режиме...) работает только с одним потоком информации(грубо говоря очередь выстраивается )...

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

Код:
CoInitializeEx (NIL, COINIT_MULTITHREADED); //создаем дополнительный поток
//выполнение созданного потока
CoUninitialize; //Даем понять COM'у , что этот поток выполнил все что от него требуется и его можно отключать, для последующего(если требуется) повторного запуска.

Для использования CoInitializeEx и CoUninitialize необходимо подключать модуль ActiveX.

Что из этого происходит:

Инициализвация(создание) новго потока проходит без вопросов, первы поток начинает выполнение, и после того, как инициализируется втрой - COM отключается от программы и пишет "не инициализирован CoInitializeEx"

Так вот НАДЕЮСЬ, что загвоздка осталась именно в инициализации потока для MTA.

Написал код для STA. Вот что получилось:
Код:
  TSTAAutoObjectFactory = class(TAutoObjectFactory,     IClassFactory)
    function CreateInstance;
  end;

  TSTAThread = class (TThread)
    procedure Execute; override;
  end;

//
function TSTAAutoObjectFactory.CreateInstance;
begin
  Создает TSTAThread, заставляет поток STA создать затребованный объект,и ждет, пока поток STA успешно создаст объект, после чего возвращает созданный экземпляр в качестве результата этого метода
end;

Выполнение:
Код:
procedure TSTAThread.Execute;
begin
  // Вход в STA
  CoInitializeEx (NIL, COINIT_APARTMENTTHREADED);
//  Создает экземпляр, затребованный TSTAAutoObjectFactory;
//  Сигнализирует потоку TSTAAutoObjectFactory.CreateInstance, что 
//  экземпляр теперь доступен
//  Вход в цикл сообщений STA
  CoUninitialize; //  Выход из STA
end;

Работает без вопросов! Все отлично! Но это STA(однопоточность)...

Стоит сделать многопоточность - сразу вылетает ошибка, что потоки не инициализированы!

Подскажите, что я не правильно делаю!!!???
Ответить с цитированием