Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
2 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 45
RAD XE3+

Использование OLE в отдельном потоке

10.12.2021, 07:45. Показов 2152. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Уже третий день бьюсь над задачей: необходимо по нажатии одной из трёх кнопок создать поток, который заблокирует кнопки, создаст ole-объект, поработает с ним и уничтожит и объект и себя, разблокировав кнопки.

Проблема заключается в том, что, либо ole-объект не хочет по какой-то причине создаваться, либо поток не завершается.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{TMainForm}
 
  type
    TMyThread = class(TThread)
      type TThreadMethod = (tmExample, tmRead, tmCreate);
      var tm: TThreadMethod;
      var w: OLEVariant;
    private
      function CreateExample(): boolean;
    protected
      procedure Execute(); override;
      constructor Create(const tmValue: TThreadMethod);
      destructor Destroy(); override;
  end;
 
var thread: TMyThread;
 
procedure TMainForm.FormDestroy(Sender: TObject);
begin
  FreeAndNil(thread);
end;
Delphi
1
2
3
4
procedure TMainForm.Button3Click(Sender: TObject);
begin
  thread := TMyThread.Create(tmExample);
end;
Delphi
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
34
35
36
37
38
39
{ TMyThread }
 
constructor TMyThread.Create(const tmValue: TThreadMethod);
begin
  Synchronize(MainForm.Lock);
  Self.tm := tmValue;
 
  inherited Create();
end;
 
destructor TMyThread.Destroy;
begin
  Synchronize(MainForm.UnLock);
 
  inherited;
end;
 
procedure TMyThread.Execute;
begin
  inherited;
 
  try
    if CoInitialize(nil) <> S_OK then raise Exception.Create('Ошибка при инициализации COM!');
 
    try
      w := CreateOLEObject({someobject}); // Здесь поток долго думает (секунд 20), затем выдаёт ошибку EOleSysError
 
      if tm = tmExample then
        if not CreateExample() then //working with `w`
          raise Exception.Create('Ошибка при работе с OLE!');
    except
      //some error dlgmsg
    end;
  finally
    CoUninitialize();
  end;
 
  Free;
end;
Видимо, я неправильно понимаю принцип работы потоков. Подскажите, пожалуйста, где я накосячил? Вне потока всё работает нормально.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.12.2021, 07:45
Ответы с готовыми решениями:

GDI+. Почему в отдельном потоке картинки сохраняются как белые прямоугольники, а в основном потоке - всё Ок?
Всем привет, делаю функцию уменьшения картинок при помощи библиотеки GDI+, в отдельном потоке происходит уменьшение картинки и её...

Компонент в отдельном потоке
Здравствуйте. Мне нужно объявить переменную невизуального компонента (для работы с rar-архивами) в отдельном потоке. У этого компонента...

Цикл в отдельном потоке
Здравствуйте, как сделать чтобы когда цикл был запущен программой можно было пользоваться?

11
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
10.12.2021, 18:01
Цитата Сообщение от __XeNoNx8000__ Посмотреть сообщение
ole-объект не хочет по какой-то причине создаваться
Перед созданием OLE написать CoInitialize(nil);
В потоке это обязательно
0
2 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 45
10.12.2021, 22:00  [ТС]
DenNik, А у меня что не так тогда?
0
 Аватар для krapotkin
6851 / 4677 / 1465
Регистрация: 14.04.2014
Сообщений: 20,674
Записей в блоге: 21
10.12.2021, 22:47
предлагаю начать эксперимент вот так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
TTask.Run(
  procedure 
  var w: OleVariant;
  begin
    try
    if CoInitialize(nil) <> S_OK then 
       raise Exception.Create('Ошибка при инициализации COM!');
       w := CreateOLEObject(GUID); 
       sleep(3000);
       w := nil;
  finally
    CoUninitialize();
  end;
  
   tthread.synchronize(nil, 
   procedure begin 
      showMessage('The End');
   end);
 
end;
);
1
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
10.12.2021, 23:02
__XeNoNx8000__, не досмотрел
0
2 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 45
10.12.2021, 23:03  [ТС]
Благодарю, гляну!
0
2 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 45
11.12.2021, 20:03  [ТС]
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
begin
  t := TTask.Create(
    procedure
    var w: OleVariant;
    begin
      try
        OleCheck(OleInitialize(nil));
 
        w := CreateOLEObject({someobject}); // та же ошибка
        w.Visible := true;
 
        //some work with `w`
 
        //complete msg
      except
        //error msg
      end;
 
      OleUninitialize();
    end
  );
 
  t.Start();
end;
Добавлено через 6 минут
Code
1
EoleSysError (ошибка при выполнении приложения-сервера)
0
 Аватар для krapotkin
6851 / 4677 / 1465
Регистрация: 14.04.2014
Сообщений: 20,674
Записей в блоге: 21
12.12.2021, 10:35
ну собсно значит проблема на стороне сервера. Он у вас вообще есть?
у меня нет MS Office, я запустил этот код для Libre Office
все отрабатывает штатно
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure TForm1.b1Click(Sender: TObject);
var t:ITask;
begin
  t := TTask.Create(
    procedure
    var w: oleVariant;
    begin
      try
        CoInitialize(nil);
 
        w := CreateOleObject('com.sun.star.ServiceManager');
        sleep(3000);
        w := Unassigned;
      finally
        CoUninitialize;
      end;
    end
  );
 
  t.Start;
end;
1
2 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 45
12.12.2021, 12:30  [ТС]
krapotkin, LibreOffice работает. А что можно с сервером ms office сделать?
0
 Аватар для krapotkin
6851 / 4677 / 1465
Регистрация: 14.04.2014
Сообщений: 20,674
Записей в блоге: 21
12.12.2021, 12:35
переустановить? проверить, верный ли GUID ?
без понятия.
к программированию и к Delphi это никаким боком...
0
2 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 45
12.12.2021, 19:52  [ТС]
Кажется, нашёл ошибку. Добавил GetActiveOleObject. При этом результат её не был успешным, и срабатывал CreateOleObject. Странно.

Добавлено через 5 часов 54 минуты

krapotkin,

А вызов Libre и OO отличается чем-то?
0
 Аватар для krapotkin
6851 / 4677 / 1465
Регистрация: 14.04.2014
Сообщений: 20,674
Записей в блоге: 21
13.12.2021, 00:29
думаю что нет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.12.2021, 00:29
Помогаю со студенческими работами здесь

Форма в отдельном потоке
Привет, есть 3 формы (грубо говоря две) одну надо запустить в отдельный поток. Form1 С нее происходит запуск формы по нажатию кнопки. ...

Вызов ApplyUpdate в отдельном потоке
Реализовал передачу обновлений данных в БД в отдельном потоке. Работает прекрасно, но после попытки получения обновленных данных с...

Обработка события COM в отдельном потоке
Всем привет! Создал обертку COM сервера стандартными функциями Delphi. На выходе получил класс TStServer для работы с COM: ...

Получение файлов в отдельном потоке
Здраствуйте. Задача найти файлы в папке делав это в отдельном потоке чтобы избавится от зависаний. Нашел пример:...

Выполнение кода в отдельном потоке
Есть код программы. Хотел бы полюбоваться красивым видом, но тут столкнулся с проблемой .... Вот код: procedure...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru