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(однопоточность)...
Стоит сделать многопоточность - сразу вылетает ошибка, что потоки не инициализированы!
Подскажите, что я не правильно делаю!!!???