powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DLL - Thread и безудержный секс
25 сообщений из 89, страница 2 из 4
DLL - Thread и безудержный секс
    #39872107
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_Xziv-2014HOME_X,
По уму надо использовать COM интерфейсы.


Их надо регистрировать в OS - системный реестр закрыт от изменений
а использовать просто DLL возможно почти вседа
Тогда выясняйте может ли VBA вызывать интерфейсы без IDispatch. С# может делать такое, наверное VB.Net может.
Может VBA сделали.
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872108
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014,
Напиши интерфейс на делфи от TInterfacedObject и передай указатель при вызове DLL из VBA и попробуй вызвать функцию из интерфейса. Если получится, можно облегчить себе работу.
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872109
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovziv-2014В VBA на прямую можно вызывать функции из DLL без COM сервера.

И получать из них RecordSet? Может, конечно, но зачем в этой картине Delphi?


переменная типа OleVariant отправляемая по ссылке решает вопрос
далее
dim D as adodb.recordset
set D = "переменная типа OleVariant отправляемая по ссылке"

Могу прислать рабочий код vba
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872110
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,
У тебя проблема в том, чтобы дождаться окончания работы потока.
Можно сделать функцию, которая будет проверять окончание работы потока.
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872112
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014ziv-2014,
Напиши интерфейс на делфи от TInterfacedObject и передай указатель при вызове DLL из VBA и попробуй вызвать функцию из интерфейса. Если получится, можно облегчить себе работу.

VBA через прямую публикацию и OLEVariant работает
VBS через COM работает
Delphi напрямую через компил. класс без потока работает
Delphi напрямую через компил. класс с потоком работает
Delphi c включением DLL без потока работает
Delphi c включением DLL с потоком ТЕСТИРУЮ...

Отошли от темы первичного сообщения о DLL->Thread->@ извращениях

Мне не нравятся передача фиксация и передача адреса, и удаление родителя класса через дочь класса

Вот это была суть вопроса - чем можно заменить
Приложите Ваш код если не сложно
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872117
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014HOME_X,
У тебя проблема в том, чтобы дождаться окончания работы потока.
Можно сделать функцию, которая будет проверять окончание работы потока.

Может быть Вы праву - ТЕСТИРУЮ ...
Сбросьте пожалуйста пример такой функции - на чем основывается, на таймере ?
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872119
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

Уважаемые господа Dimitry Sibiryakov, ziv-2014, ёёёёё

Спасибо за диалог и доброй ночи !!!!!


P.S. - пишите Ваши соображения в коде - так намного понятнее
и эффективнее общаться.До утра
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872141
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014HOME_X,
У тебя проблема в том, чтобы дождаться окончания работы потока.
Можно сделать функцию, которая будет проверять окончание работы потока.

Вы правы - есть такой момент = "окончание работы"
Сбросьте вашу функцию пожалуйста
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872143
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_Xziv-2014HOME_X,
У тебя проблема в том, чтобы дождаться окончания работы потока.
Можно сделать функцию, которая будет проверять окончание работы потока.

Вы правы - есть такой момент = "окончание работы"
Сбросьте вашу функцию пожалуйста
Это вопрос реализации. Я предложил подождать поток. Но этот вариант не подошел.
Возникает вопрос: где вы будете ждать поток? В коде VBA?
Можно передавать через таймер результаты. Но тогда надо знать адрес функции в VBA, которой передавать результаты? Тоже как вариант решения проблемы. Есть же по-моему такая функция в VBA AddressOf, которая возвращает адрес функции.
https://docs.microsoft.com/ru-ru/dotnet/visual-basic/language-reference/operators/addressof-operator
Фактически можно реализовать типа колбеков. Надо эту тему поисследовать.

Я вас просил узнать, можно ли в VBA передавать указатели на интерфейсы через функции в DLL и вызывать методы интерфейса в VBA? Я не пробовал.

Лучше все же реализовать COM сервер и проще и надежнее.
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872151
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014HOME_Xпропущено...


Вы правы - есть такой момент = "окончание работы"
Сбросьте вашу функцию пожалуйста
Это вопрос реализации. Я предложил подождать поток. Но этот вариант не подошел.
Возникает вопрос: где вы будете ждать поток?

Пусть будет Ваша функция применительно к Delphi
т.е. DLL->Thread->Delphi


P.S. Не работает Synchronize... полное отсутствие реакции
если простой вызов процедуры все в норме

procedure MyPause
begin
ShowMessage('Pause');
end;

procedure Execute
................
MyPause -- норма
Synchronize(MyPause) -- полное игнорирование
.............
end
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872157
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_Xziv-2014пропущено...

Это вопрос реализации. Я предложил подождать поток. Но этот вариант не подошел.
Возникает вопрос: где вы будете ждать поток?

Пусть будет Ваша функция применительно к Delphi
т.е. DLL->Thread->Delphi


P.S. Не работает Synchronize... полное отсутствие реакции
если простой вызов процедуры все в норме

procedure MyPause
begin
ShowMessage('Pause');
end;

procedure Execute
................
MyPause -- норма
Synchronize(MyPause) -- полное игнорирование
.............
end
А причем здесь Synchronize -то это в общем-то внутренняя функция синхронизации с основным потоком в VCL.
Если вы ее используете в VBA, то ничего работать не будет.
1. Запустили поток.
2. Дождались результатов.
3. Возвратили результаты. Но синхронизацию надо делать через создание невидимового окна TWinControl.
Пример реализации есть тут https://github.com/wadman/wthread
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872158
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014,
Для синхронизации необходимо
1. Создать окно FToolWindow := AllocateHWnd(WWindowProc) при создании потока;
2. Послать сообщение через SendMessage/PostMessage(FToolWindow, ...) - это будет синхронизация.
3. В функции WWindowProc делать вызов Callback из VBA.
4. Удалить окно при завершении потока DeallocateHWnd(FToolWindow);
Как-то так должно работать.
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872161
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_Xпишите Ваши соображения в коде - так намного понятнее
и эффективнее общаться.

Зачем? У тебя же уже всё работает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39873067
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014ziv-2014,
3. В функции WWindowProc делать вызов Callback из VBA.


Относительно VBA - хочу чуть отложить тему

Вот что имею по Delphi->DLL->Thread
Можете дать грамотный совет относительно решения - так как применительно к нижеизложенному
это даже не СЕКС, а малолетный онанизм

Относительно потока и его "счастливого окончания"
Исходя из проведенных тестов могу заключить что в случае с DLL событие окончания
выполнения работ (после метода Execute) "теряеться где-то там".
Обработчик потока OnTerminate его не получает.

Текущее "затычка-решение"
Внедрение объекта TTimer, включаю после выполнение основной процедуры метода Execute
на его событие вешаю - выключение таймера и выполнение списка "close-terminate" со-
бытий потока. Эффект и работоспособность восстановлена.


Это описание "поле-потока"

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  TAddExec = class(TThread)
  private
    ParentExecute: TExecute;
    AddTerminate:  TTerminate;
   protected
    //
  public
    HandleParent: TAddSpan;
    constructor Create(aHandleParent: TAddSpan; aExecute: TExecute; aTerminate: TTerminate);
    destructor  Destroy;
    procedure   Execute; override;
  published
    //
  end;




Это описание "родитель-объекта"

Код: pascal
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.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
  TAddSpan = class(TObject)
  private
    ttExit:   TTimer;
    thExec:   TAddExec;

  protected
    //
  public
    procedure   TerminateThread(Sender: TObject);
    procedure   KillThread(Sender: TObject);
  published
    //
  end;


  constructor TAddSpan.Create(aFile: String; aBars: TProgressBar; Terminate: TTerminate; var aSql: OleVariant; var aRecordSet: OleVariant);
  var I: Integer;
      ...........
  begin
    Inherited Create;
    .............................
    ttExit:=TTimer.Create(Nil);
    ttExit.Enabled:=False;
    ttExit.Interval:=50;
    ttExit.OnTimer :=KillThread;
    .............................
    pSql:=@aSql;
    pSet:=@aRecordSet;
  end;


  constructor TAddExec.Create(aHandleParent: TAddSpan; aExecute: TExecute; aTerminate: TTerminate);
  begin
    Inherited Create(True);
    HandleParent   :=aHandleParent;
    ParentExecute  :=aExecute;
    AddTerminate   :=aTerminate;
    FreeOnTerminate:=True;                          -- эти методы не работаю поставил для порядка
    OnTerminate    :=HandleParent.TerminateThread;  -- эти методы не работаю поставил для порядка 
  end;



  ......

  procedure TAddExec.Execute;
  begin
    ParentExecute;
    HandleParent.ttExit.Enabled:=True;
  end;


  procedure TAddSpan.KillThread(Sender: TObject);
  begin
    ttExit.Enabled:=False;
    thExec.Terminate;
    while (not thExec.Terminated) do begin
    end;
    thExec.Free;
    thExec:=Nil;
    //ShowMessage('For call Event terminate');
    TerminateThread(Sender);
  end;

  procedure TAddSpan.TerminateThread(Sender: TObject);
  begin
    pSql^:=OleVariant(SQL);
    if Assigned(adResult) then pSet^:=adResult.Recordset;
    if(Sender<>Nil)then mtExit(Self);
    Self.Free;
    Self:=Nil;
  end;




Есть второй вариант - если ПРОСТО вызвать ShowMessage(....)
функциональность восстановлена в полном объеме

Т.е. сделать так

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  procedure TAddSpan.KillThread(Sender: TObject);
  begin
    //ttExit.Enabled:=False;
    //thExec.Terminate;
    //while (not thExec.Terminated) do begin
    //end;
    //thExec.Free;
    //thExec:=Nil;
    ShowMessage('For call Event terminate');
    //TerminateThread(Sender);
  end;




Отсюда вопрос - что происходит с приложение и как, где и с
какого места программного кода можно сэммулировать и отправить
сообщение системе (Send/Post Message)
для устранения системной
ошибки.


Заранее благодарен !
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39873068
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovHOME_Xпишите Ваши соображения в коде - так намного понятнее
и эффективнее общаться.

Зачем? У тебя же уже всё работает.


У меня есть стремление не только закрыть дыры - сделать верное решение
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39873164
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,
Обработчик потока OnTerminate его не получает.
OnTerminate - работает через synhronize и поэтому это только делфи решение.
Использовать надо SendMessage/PostMessage.
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39873165
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,
Отсюда вопрос - что происходит с приложение и как, где и с
какого места программного кода можно сэммулировать и отправить
сообщение системе (Send/Post Message) для устранения системной
ошибки.

Создавай вместе с потоком дополнительное окно и разрушай его, когда поток будет завершен.
И через это окно синхронизируйся при помощи SendMessage/PostMessage.
У тебя вызовы из VBA происходят в главном потоке?
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39873230
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

в реализации потоков есть заглушка, обработчик WakeMainThread

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

и всё будет работать стандартно
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39873665
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)HOME_X,
обработчик WakeMainThread


Хотел бы опробывать Ваш вариант

Имею описание класса
Код: pascal
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.
type
  TDLLThreadSync=class
  private
    FWnd:HWND;
    procedure WndProc(var Msg:TMessage);
    procedure WakeMainThread(Sender:TObject);
  public
    constructor Create;
    destructor Destroy; override;
  end;

{ TDLLThreadSync }

constructor TDLLThreadSync.Create;
begin
  FWnd:=AllocateHWnd(WndProc);
  Classes.WakeMainThread:=WakeMainThread;
end;

destructor TDLLThreadSync.Destroy;
begin
  Classes.WakeMainThread:=nil;
  DeallocateHWnd(FWnd);
end;

procedure TDLLThreadSync.WakeMainThread(Sender:TObject);
begin
  PostMessage(FWnd,WM_NULL,0,0);
end;

procedure TDLLThreadSync.WndProc(var Msg:TMessage);
begin
  if Msg.Msg=WM_NULL then
    CheckSynchronize
  else
    Msg.Result:=DefWindowProc(FWnd,Msg.Msg,Msg.wParam,Msg.lParam);
end;



DLL -> родитель объект ->поле поток
(уточните верно ли понял где именно надо создать класс TDLLThreadSync)
После выполнения основного задания в Execute - удаляю этот класс, по логике должна
возникнуть синхронизация и отработать событие
OnTerminate :=HandleParent.TerminateThread1;

Но результат не получен - где ошибся ?
где необходимо создать класс TDLLThreadSync
- основная форма (НЕ DLL)
- DLL -> классе родителе ?
- DLL-> класс родителя -Ю Юполе потоке ?

Спасибо

Код: pascal
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.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
  TAddExec = class(TThread)
  private

    DLLThreadSync: TDLLThreadSync;

    ParentExecute: TExecute;
    AddTerminate:  TTerminate;
   protected
    //
  public
    HandleParent: TAddSpan;
    constructor Create(aHandleParent: TAddSpan; aExecute: TExecute; aTerminate: TTerminate);
    destructor  Destroy;
    procedure   Execute; override;
  published
    //
  end;

  constructor TAddExec.Create(aHandleParent: TAddSpan; aExecute: TExecute; aTerminate: TTerminate);
  begin
    Inherited Create(True);

    DLLThreadSync  :=TDLLThreadSync.Create;

    HandleParent   :=aHandleParent;
    ParentExecute  :=aExecute;
    AddTerminate   :=aTerminate;
    FreeOnTerminate:=True;
    OnTerminate    :=HandleParent.TerminateThread1;
  end;

  destructor TAddExec.Destroy;
  begin
    inherited;
  end;

  procedure TAddExec.Execute;
  begin
    ParentExecute;

    DLLThreadSync.Free;

  end;

  procedure TAddSpan.TerminateThread1(Sender: TObject);
  begin
    ShowMessage('Call Terminate');
    TerminateThread(Sender);
  end;

  procedure TAddSpan.TerminateThread(Sender: TObject);
  begin
    pSql^:=OleVariant(SQL);
    if Assigned(adResult) then pSet^:=adResult.Recordset;
    if(Sender<>Nil)then mtExit(Self);
    Self.Free;
    Self:=Nil;
  end;
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39873674
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

авторПосле выполнения основного задания в Execute - удаляю этот класс, по логике должна
возникнуть синхронизация и отработать событие
OnTerminate :=HandleParent.TerminateThread1;нет, OnTerminate вызывается после выполнения этого метода

по идее вот так должно работать
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 destructor TAddExec.Destroy;
  begin
    inherited;

    DLLThreadSync.Free;
  end;

  procedure TAddExec.Execute;
  begin
    ParentExecute;

  end;
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39873729
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

я чесно говоря не вижу зачем в вашем случае вообще использовать синхронизацию

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

Код: pascal
1.
2.
3.
4.
5.
6.
procedure DoTerminate; virtual;

procedure TThread.DoTerminate;
begin
  if Assigned(FOnTerminate) then Synchronize(CallOnTerminate);
end;



на что то типа

Код: pascal
1.
2.
3.
4.
procedure TMyThread.DoTerminate;
begin
  if Assigned(OnTerminate) then OnTerminate(Self);
end;


или вообще сразу код


Код: pascal
1.
2.
3.
4.
procedure TMyThread.DoTerminate;
begin
  // ваш код на завершение
end;
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39874938
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
Код: pascal
1.
2.
3.
4.
5.
6.
 destructor TAddExec.Destroy;
  begin
    inherited;

    DLLThreadSync.Free;
  end;




В целом все получилось с доп. объектом
Только вот так .....
Код: pascal
1.
2.
3.
4.
5.
 destructor TAddExec.Destroy;
  begin
    DLLThreadSync.Free;
    inherited;
  end;
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39875383
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,
TThread
Это какой-то позор...
Код: pascal
1.
2.
3.
4.
5.
6.
7.
 
 BeginThread()
 // CreateThread() 
 CreateEvent()
 WaitForSingleObject()
 WaitForMultipleObjects()
 CloseHandle()
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39875453
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeM,
IsMultiThreaded = true
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39877947
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeMHOME_X,
TThread
Это какой-то позор...
Код: pascal
1.
2.
3.
4.
5.
6.
7.
 
 BeginThread()
 // CreateThread() 
 CreateEvent()
 WaitForSingleObject()
 WaitForMultipleObjects()
 CloseHandle()



Не совсем Вас понял - Вы желаете сделать свой объект TThread ?
Не используя наследственность от системного TThread ?
...
Рейтинг: 0 / 0
25 сообщений из 89, страница 2 из 4
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DLL - Thread и безудержный секс
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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