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

Имею первичную постановку
1.Динамический вызов из библиотека DLL
2.Создаю пользовательский объект AddSpan
3.Основная функция объекта AddSpan это Execute
4.Поле объекта Thread, который может запуска Execute в потоке (по потребности)
5.Возврат значения RecordSet, по результатам выполнения (в примере возвращаю String)

Проблема при вызове в потоке, невозможно вернуть результат


Возможное решение
1. При создание AddSpan - фиксирую адрес ячейки

constructor TAddSpan.Create(aFile: String; aBars: TProgressBar; Terminate: TTerminate; var aSql: OleVariant);
...............
pSql:=@aSql;
................

2.При создании поля-потока, фикcирую родитель-объект
constructor TAddExec.Create(aHandleParent: TAddSpan; aExecute: TExecute; aTerminate: TTerminate);
................
HandleParent :=aHandleParent;
................

3.При окончании работы потока - уничтожаю родитель-объект, предварительно по адресу
передав результат выполнения функции Execute

procedure TAddExec.TerminateThread(Sender: TObject);
begin
HandleParent.pSql^:=OleVariant(HandleParent.SQL); - возврат результата
HandleParent.Free;
HandleParent:=Nil;
AddTerminate(Sender); - доп. процедура которая в основной форме
end;

Не нравится
- " окончания работы потока - уничтожаю родитель-объект"
уничтожить из дочери - родителя - не есть архитектурно !

- слишком сексуально !!!! и много извращений связанных с адресами переменных

Но другого решения увы не нашел.
О великие ГУРУ прошу подсказать более технологичное решение (можно с примером)

Заранее благодарен !

Имею код вызова
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
Create_AddSpan: function(aFile: String; aList: String; aThread: Boolean; aBar: TProgressBar; Terminate: TTerminate; var aSql: OleVariant): Integer; stdcall;

@Create_AddSpan:=nil;
LibHandle := LoadLibrary('MyLibrary.dll');
if LibHandle >= 32 then begin
  @Create_AddSpan:=GetProcAddress(LibHandle,'Create_AddSpan');
  if @Create_AddSpan<>nil then Create_AddSpan(aFile,aList,True,pbMain,TerminateThread,ovSql);
end;
FreeLibrary(LibHandle); //если поток уничтожать нельзя



Пользовательский класс

Код: 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.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
unit AddSpan;

type
  POleVariant = ^OleVariant;
  TAddSpan    = class;
  TExecute    = procedure of object;
  TTerminate  = procedure(Sender: TObject) of object;


  TAddExec = class(TThread)
  private
    ParentExecute: TExecute;
    AddTerminate:  TTerminate;
   protected
    //
  public
    HandleParent: TAddSpan;
    constructor   Create(aHandleParent: TAddSpan; aExecute: TExecute; aTerminate: TTerminate);
    procedure     Execute; override;
    procedure     TerminateThread(Sender: TObject);
  published
    //
  end;

  TAddSpan = class(TObject)
  private
    thExec:   TAddExec;
    mtExit:   TTerminate;
    pSql:     POleVariant;
 protected
    //
 public
    SQL:        String;
    constructor Create(aFile: String; aBars: TProgressBar; Terminate: TTerminate; var aSql: OleVariant); virtual;
    procedure   Execute;
    procedure   ExecuteThread;
  published
    //
  end;

implementation

  function Create_AddSpan(aFile: String; aList: String; aThread: Boolean; aBar: TProgressBar; Terminate: TTerminate; var aSql: OleVariant): Integer;
  var A: TAddSpan;

      I: Integer;
      L: Boolean;
      S,List: String;

  begin
    A:=TAddSpan.Create(aFile,aBar,Terminate,aSql);
    .........................
    if aThread then A.ExecuteThread else A.Execute;

    //если поток уничтожать нельзя - 3-и строки это ошибка
    aSql:=OleVariant(A.sSql);
    A.Free;
    A:=Nil;
  end;

  constructor TAddExec.Create(aHandleParent: TAddSpan; aExecute: TExecute; aTerminate: TTerminate);
  begin
    Inherited Create(True);
    HandleParent   :=aHandleParent;
    ParentExecute  :=aExecute;
    AddTerminate   :=aTerminate;
    FreeOnTerminate:=True;
    OnTerminate    :=TerminateThread;
  end;

  procedure TAddExec.TerminateThread(Sender: TObject);
  begin
    HandleParent.pSql^:=OleVariant(HandleParent.SQL);
    HandleParent.Free;
    HandleParent:=Nil;
    AddTerminate(Sender);
  end;

  procedure TAddExec.Execute;
  begin
    ParentExecute;
  end;

  constructor TAddSpan.Create(aFile: String; aBars: TProgressBar; Terminate: TTerminate; var aSql: OleVariant);
  var I: Integer;
      S: TArrayStr;
      Sect,Note: String;
  begin
    Inherited Create;
    .........................
    mtExit:=Terminate;
    pSql:=@aSql;
  end;

  destructor TAddSpan.Destroy;
  begin
    .................
    inherited;
  end;

  procedure TAddSpan.Execute;
  var I: Integer;
      L: Boolean;

  begin
    CoInitialize(nil);
    try
      SQL:='значение этой переменной нужно вернуть';
    ................................
    end;
    CoUninitialize;
  end;

  procedure TAddSpan.ExecuteThread;
  begin
    thExec:=TAddExec.Create(Self,Self.Execute,Self.mtExit);
    thExec.Resume;
  end;

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

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


Если желаете помочь - пишите четко, и на конкретном примере
Если НЕ желаете помочь НЕ пишите в 101 раз...

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

а что тебе непонятно, конкретно? Не знаешь, что такое сообщения, сообщения Windows, очередь сообщений нити, ... - что?
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872039
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёёHOME_X,

а что тебе непонятно, конкретно? Не знаешь, что такое сообщения, сообщения Windows, очередь сообщений нити, ... - что?


Изложите Ваши мысли в конкретный программный код

Спасибо
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872048
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XИмею первичную постановку
1.Динамический вызов из библиотека DLL

Твой код где: в основном приложении или в библиотеке? Потоки где: в основном приложении
или библиотеке?

Во втором случае обломись, потоки и DLL это тема на которой обламывают зубы даже зубры,
новичкам туда лучше не лезть вообще.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872055
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovHOME_XИмею первичную постановку
1.Динамический вызов из библиотека DLL

Твой код где: в основном приложении или в библиотеке? Потоки где: в основном приложении
или библиотеке?

Во втором случае обломись, потоки и DLL это тема на которой обламывают зубы даже зубры,
новичкам туда лучше не лезть вообще.


1.
- пользовательский объект находиться в DLL
- в этом объекте находиться метод Execute, вызываться как линейно так и в потоке
- в этом объекте находиться метод ExecuteThread, который "заворачивает" Execute
и выполняет его в потоке
- этот объект возвращает тип RecordSet (OleVariant - так как эта DLL будет использоваться
НЕ только исходниками Delphi)
- вызывающий код, находиться в основном приложении , вызов объекта осуществляется динамически
(LoadLibrary->FreeLibrary)

Если есть еще вводные вопросы - прошу Вас.....

P.S. "зубы даже зубры"
Зубрами не рождаются, "горшки не только программисты обжигают"
Во времени особо не ограничен, если конкретизируете тему "потоки и DLL" (примеры , статьи , ссылки)
узнать новое и практически применить знания буду рад.


Спасибо за уделенное время.
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872056
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovHOME_XИмею первичную постановку
1.Динамический вызов из библиотека DLL

Твой код где: в основном приложении или в библиотеке? Потоки где: в основном приложении
или библиотеке?

Во втором случае обломись, потоки и DLL это тема на которой обламывают зубы даже зубры,
новичкам туда лучше не лезть вообще.

Какая разница, где поток в основном приложении или в DLL? Потоку в общем-то насрать, где крутиться.
Проблема в менеджере памяти и общих данных.
Есть особенности работы при инициализации DLL, но в целом потоку без разницы.

А вообще тема норм, хорошо названа, побольше бы таких тем
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872060
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 function Create_AddSpan(aFile: String; aList: String; aThread: Boolean; aBar: TProgressBar; Terminate: TTerminate; var aSql: OleVariant): Integer;
  var A: TAddSpan;

      I: Integer;
      L: Boolean;
      S,List: String;

  begin
    A:=TAddSpan.Create(aFile,aBar,Terminate,aSql);
    .........................
    if aThread then A.ExecuteThread else A.Execute;

    //если поток уничтожать нельзя - 3-и строки это ошибка
    aSql:=OleVariant(A.sSql);
    A.Free;
    A:=Nil;
  end;



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

....OleVariant - так как эта DLL будет использоваться НЕ только исходниками Delphi

Основное приложение (оно же Delphi, оно же VBS, оно же VBA, оно же ............)
ссылается на логически законченный объект, который в DDL

Побольше технологически грамотных решений и понимания тоже не помешает..

А кто поток ждать будет?
А вообще это лучше реализовывать на интерфейсах.

В Delphi - основная форма - AddTerminate

Код: pascal
1.
2.
3.
4.
5.
6.
7.
 procedure TAddExec.TerminateThread(Sender: TObject);
  begin
    HandleParent.pSql^:=OleVariant(HandleParent.SQL);
    HandleParent.Free;
    HandleParent:=Nil;
    AddTerminate(Sender); - это процедура основной формы, которая обновить 'дерево" штатки
  end;



Буду рад осмотреть Ваш вариант решения
если начальных вводных недостаточно - прошу вопрошать..
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872071
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot HOME_X]
Основное приложение (оно же Delphi, оно же VBS, оно же VBA, оно же ............)
[/src]

Добавлю что исходя из вызывающего приложения в DLL реализовано несколько сценариев вызова,
в том числе и COM - сервер, ряд местных особенностей и настроек ПК, требуют простой реализации
(например DLL в текущей папке вместе с EXE или по заданному путь в "открытом" коде VBA)
так как нет доступа к изменению системной переменой Path, и невозможно изменить системный реестр

Т.е. у меня ПОКА стоит первичная задача - DLL -> Thread -> возврат RecordSet.....
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872084
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014Есть особенности работы при инициализации DLL, но в целом потоку без разницы.

При инициализации-то это ещё цветочки. Выгрузка это то место где из-под потока может
внезапно исчезнуть его код, не говоря уже о поддерживающей RTL.

HOME_XТ.е. у меня ПОКА стоит первичная задача - DLL -> Thread -> возврат RecordSet.....

Обломись. Так работать не будет даже если ты перечитаешь целый MSDN. Тут нужен COM-сервер.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872086
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,
String, TObject и другие типы - тоже поддерживаются VBA?
Что-то не похоже на COM.
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872089
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При инициализации-то это ещё цветочки. Выгрузка это то место где из-под потока может
внезапно исчезнуть его код, не говоря уже о поддерживающей RTL.

1. Загрузили DLL
2. Запустили поток в отдельной процедуре
3. Остановили поток, убедились, что он остановлен полностью.
4. Выгрузили DLL
Как то так? А еще желательно скомпилировать dll и exe с одним bpl пакетом, чтобы не маятся с менеджером памяти.
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872090
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,
Проблема при вызове в потоке, невозможно вернуть результат

У вас корявый код, надо ждать, когда выполнится поток и только потом получать результат.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
function Create_AddSpan(aFile: String; aList: String; aThread: Boolean; aBar: TProgressBar; Terminate: TTerminate; var aSql: OleVariant): Integer;
  var A: TAddSpan;

      I: Integer;
      L: Boolean;
      S,List: String;

  begin
    A:=TAddSpan.Create(aFile,aBar,Terminate,aSql);
    .........................
    if aThread then begin 
      A.ExecuteThread; 
      A.WaitFor; //Надо ждать результат 
    end else A.Execute;

    //если поток уничтожать нельзя - 3-и строки это ошибка
    aSql:=OleVariant(A.sSql); //??? В A - это результат?
    A.Free;
    A:=Nil;
  end;



По уму надо использовать COM интерфейсы. А не вот это все. Тем более для VBA.
Если же вызывать на прямую из VBA, то VBA не понимает делфи объекты, а стринги воспринимает как Ansi. String в последних версиях делфи уникодный.
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872091
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovHOME_XТ.е. у меня ПОКА стоит первичная задача - DLL -> Thread -> возврат RecordSet.....

Обломись. Так работать не будет даже если ты перечитаешь целый MSDN. Тут нужен COM-сервер.

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

И получать из них RecordSet? Может, конечно, но зачем в этой картине Delphi?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872098
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovziv-2014Есть особенности работы при инициализации DLL, но в целом потоку без разницы.

При инициализации-то это ещё цветочки. Выгрузка это то место где из-под потока может
внезапно исчезнуть его код, не говоря уже о поддерживающей RTL.

HOME_XТ.е. у меня ПОКА стоит первичная задача - DLL -> Thread -> возврат RecordSet.....

Обломись. Так работать не будет даже если ты перечитаешь целый MSDN. Тут нужен COM-сервер.


Да в общем все работает ....
Мне не понравилась работа с адресами и уничтожением "родителя в дочере"

Буду еще тестировать... может всплывуют ошибки
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872099
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014HOME_X,
String, TObject и другие типы - тоже поддерживаются VBA?
Что-то не похоже на COM.

Использую OLEVariant ....
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872102
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovziv-2014В VBA на прямую можно вызывать функции из DLL без COM сервера.

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

Автор собрался получать данные в String->WideString->OleVariant, и простые типы можно и так.
Я бы сделал через PAnsiChar - так быстрее, и надо память выделять правильно.
А так конечно боль RecordSet передавать. Умнее запихать интерфейсы. Может ли VBA вызывать интерфейсы без IDispatch - если умеет то, можно обойтись малой кровью. А если не умеет, то лучше сделать COM Server - это добро можно будет использовать в любом месте без проблем.
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872103
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014HOME_X,
Проблема при вызове в потоке, невозможно вернуть результат

У вас корявый код, надо ждать, когда выполнится поток и только потом получать результат.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
function Create_AddSpan(aFile: String; aList: String; aThread: Boolean; aBar: TProgressBar; Terminate: TTerminate; var aSql: OleVariant): Integer;
  var A: TAddSpan;

      I: Integer;
      L: Boolean;
      S,List: String;

  begin
    A:=TAddSpan.Create(aFile,aBar,Terminate,aSql);
    .........................
    if aThread then begin 
      A.ExecuteThread; 
      A.WaitFor; //Надо ждать результат 
    end else A.Execute;

    //если поток уничтожать нельзя - 3-и строки это ошибка
    aSql:=OleVariant(A.sSql); //??? В A - это результат?
    A.Free;
    A:=Nil;
  end;



По уму надо использовать COM интерфейсы. А не вот это все. Тем более для VBA.
Если же вызывать на прямую из VBA, то VBA не понимает делфи объекты, а стринги воспринимает как Ansi. String в последних версиях делфи уникодный.

Этих строк не должно быть именно здесь
Они в событии OnTerminate

aSql:=OleVariant(A.sSql); //??? В A - это результат?
A.Free;
A:=Nil;

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


Их надо регистрировать в OS - системный реестр закрыт от изменений
а использовать просто DLL возможно почти вседа
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872105
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,
а если ставить WaitFor - тормознете основную форму - тогда нет смысла в потоке
Тогда ни как, меняйте подход. Вы как результат дождетесь? Можно использовать колбеки, но как их реализовать в VBA я не знаю.
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39872106
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014В VBA на прямую можно вызывать функции из DLL без COM сервера.


Именно так - что с успехом протестировал (но на тот момент быз потока)
...
Рейтинг: 0 / 0
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
DLL - Thread и безудержный секс
    #39877950
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014Bred eFeM,
IsMultiThreaded = true

Идея с доп. классом вполне себе оправдала
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
type
  TDLLThreadSync=class
  private
    FWnd:HWND;
    procedure WndProc(var Msg:TMessage);
    procedure WakeMainThread(Sender:TObject);
  public
    constructor Create;
    destructor Destroy; override;
  end;



Есть некоторые побочные эффекты
1. Приложения НУ ОЧЕНЬ долго закрывается
- если без потока в течении 0.7-1 сек
- после применения приема с потока и доп. классом 10-12 сек

2. После применения приема с потоком - сворачиваем основную форму
(или переопределяем фокус на любое другое окно операционной системы)
и вновь разворачиваем форму или возвращаем фокус на окно приложения

Имеем системную ошибку доступа к памяти, похожую на ту , которая возникает
при обращении к методу уже от-Free - го объекта.
Т.е. как будто в "нити сообщений" осталась ссылка на Handle окна TDLLThreadSync

А как ее убрать мне не ясно - можите что-то подсказать ?

Спасибо !
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39877969
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не совсем Вас понялГлавное, чтобы понял, например, Джеффри Рихтера ))
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39878168
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

1. попробуй сделать окно сам, без AllocateHWnd (см HWND_MESSAGE), у тебя всё равно привязки к объекту в обработчике нет да и вообше класс там излишен
достаточно же двух методов по типу StartSupport\ EndSupport

2. WM_NULL замени на что нить другое, самое правильное будет использовать для генерации RegisterWindowMessage - нехорошо в чужом приложении использовать известные константы, особенно которые довольно специфичеки обрабатываются
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39878178
b0rk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014Bred eFeM,
IsMultiThreaded = true
+1
убедитесь, что в DLL в блоке begin..end устанавливается IsMultiThread := True
иначе ваш секс с Thread в DLL будет не только безудержным, но еще и нескончаемым
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39878212
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
b0rkziv-2014Bred eFeM,
IsMultiThreaded = true
+1
убедитесь, что в DLL в блоке begin..end устанавливается IsMultiThread := True
иначе ваш секс с Thread в DLL будет не только безудержным, но еще и нескончаемым
Господа советчики, а вы хоть раз заглядывали в beginthread?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
function BeginThread(SecurityAttributes: Pointer; StackSize: LongWord;
  ThreadFunc: TThreadFunc; Parameter: Pointer; CreationFlags: LongWord;
  var ThreadId: LongWord): Integer;
var
  P: PThreadRec;
begin
  if Assigned(SystemThreadFuncProc) then
    P := PThreadRec(SystemThreadFuncProc(ThreadFunc, Parameter))
  else
  begin
    New(P);
    P.Func := ThreadFunc;
    P.Parameter := Parameter;
  end;
  IsMultiThread := TRUE;
  Result := CreateThread(SecurityAttributes, StackSize, @ThreadWrapper, P,
    CreationFlags, ThreadID);
end;

...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39878230
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,
я, например, не использую BeginThread, как и разные костыли типа TThread.
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39878290
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёёя, например, не использую BeginThread, как и разные костыли типа TThread.Ты ещё скажи что классы не юзаешь и вообще менеджером памяти в делфи не пользуешься...
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39878394
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanb0rkпропущено...

+1
убедитесь, что в DLL в блоке begin..end устанавливается IsMultiThread := True
иначе ваш секс с Thread в DLL будет не только безудержным, но еще и нескончаемым
Господа советчики, а вы хоть раз заглядывали в beginthread?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
function BeginThread(SecurityAttributes: Pointer; StackSize: LongWord;
  ThreadFunc: TThreadFunc; Parameter: Pointer; CreationFlags: LongWord;
  var ThreadId: LongWord): Integer;
var
  P: PThreadRec;
begin
  if Assigned(SystemThreadFuncProc) then
    P := PThreadRec(SystemThreadFuncProc(ThreadFunc, Parameter))
  else
  begin
    New(P);
    P.Func := ThreadFunc;
    P.Parameter := Parameter;
  end;
  IsMultiThread := TRUE;
  Result := CreateThread(SecurityAttributes, StackSize, @ThreadWrapper, P,
    CreationFlags, ThreadID);
end;



Дело далеко не только в старте потоков.
Если в dll первый вызов BeginThread произойдет после того, как эту dll уже юзают несколько потоков (что вполне часто бывает), или вызовов BeginThread в этой dll вообще не предвидится, то плохо будет всё равно, и спасёт только

b0rkубедитесь, что в DLL в блоке begin..end устанавливается IsMultiThread := True
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39878416
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,
+1E10.
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39878775
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)HOME_X,

1. попробуй сделать окно сам, без AllocateHWnd (см HWND_MESSAGE), у тебя всё равно привязки к объекту в обработчике нет да и вообше класс там излишен
достаточно же двух методов по типу StartSupport\ EndSupport


Доброго дня kealon(Ruslan)
Попытался изобразить взаимодействие из двух методов
Как правильно послать сообщение об окончании потока

PostMessage(Form1.Handle, Wm_Finished, 1, LParam(Param)); - не доходит до адресата
procedure WmFinished(var Msg: TWmFinished); не выполняется

Заранее благодарен !

Код: 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.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

const
   Wm_Finished = Wm_User;

type
  TThreadInfo = class;

  TWmFinished = packed record
    Msg: Cardinal;
    Info: TThreadInfo;
    Aborted: Boolean;
    TotalLoop: Integer;
    CurrentLoop: Integer;
    Result: LongInt;
  end;

  TThreadInfo = class
  private
    fTotalLoop:   Integer;
    fCurrentLoop: Integer;
    fAborted:     Boolean;
  Public
    constructor   Create(aTotal:	Integer);
    destructor    Destroy; override;
    procedure     Abort;

    property TotalLoop:   Integer read fTotalLoop;
    property CurrentLoop: Integer read fCurrentLoop write fCurrentLoop;
    property Aborted:     Boolean read fAborted;
  end;

const
    MaxIterations = 20000;


type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    Thread: Integer;
    Info: TThreadInfo;
    procedure WmFinished(var Msg: TWmFinished);
    procedure StartThread;
    procedure FormClosed(Sender:  TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function HandeAbortThread(Param: Pointer): Integer;
var
  InfoMail: TThreadInfo;
  I: Integer;
begin
  Result :=0;
  InfoMail := TThreadInfo(Param);
  for I := 0 to InfoMail.TotalLoop do begin
    InfoMail.CurrentLoop:=I;
    if InfoMail.Aborted then begin
      PostMessage(Form1.Handle, Wm_Finished, 1, LParam(Param));
      Exit;
    end;
  end;
  PostMessage(Form1.Handle, Wm_Finished, 0, LParam(Param));
end;

constructor TThreadInfo.Create(aTotal:	Integer);
begin
  fTotalLoop:=aTotal;
end;

destructor TThreadInfo.Destroy;
begin
  Free;
end;

procedure TThreadInfo.Abort;
begin
  fAborted:=True;
end;

procedure TForm1.WmFinished(var Msg: TWmFinished);
begin
  Label1.Caption:='Thread Finished';
  if not Msg.Info.Aborted then Label1.Caption:=Label1.Caption+' '+IntToStr(Msg.Info.CurrentLoop);
  FreeAndNil(Msg.Info);
  CloseHandle(Thread);
  Thread  := 0;
end;

procedure TForm1.StartThread;
var
  Id:  Cardinal;
begin
  Info  := TThreadInfo.Create(10000);
  Thread:= BeginThread(nil,0,@HandeAbortThread,Info,0,Id);
end;

procedure TForm1.FormClosed(Sender:  TObject);
begin
  if Info <> nil then Info.Abort;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  StartThread;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FormClosed(Sender);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Info.Abort;
end;

end.
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39878785
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,
Реализовал такой обработчик - но не ясно почему первый вариант с WmFinished не работает
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := AppMessage;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Application.OnMessage := nil;
end;

procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
var
  Info: TThreadInfo;
begin
  if Msg.Message = Wm_Finished then begin
    Info:= TThreadInfo(Msg.lParam);
    ShowMessage('Thread Finished '+IntToStr(Info.CurrentLoop));
    Handled:= True;
  end;
end;
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39878819
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XHOME_X,
Реализовал такой обработчик - но не ясно почему первый вариант с WmFinished не работает

Очевидно, потому что надо читать справку:
Код: pascal
1.
    procedure WmFinished(var Msg: TWmFinished); message WM_FINISHED;
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39878823
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

Как вы думаете, эти записи по размерам совпадают?..
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  TMessage = record
    Msg: Cardinal;
    WParam: WPARAM;
    LParam: LPARAM;
    Result: LRESULT);
  end;

  TWmFinished = packed record
    Msg: Cardinal;
    Info: TThreadInfo;
    Aborted: Boolean;
    TotalLoop: Integer;
    CurrentLoop: Integer;
    Result: LongInt;
  end;


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


Вариант взят из IE delphi-учебника ...
Первичный синтаксис немного удивил .... но передать СВОЙ тип параметра (TWmFinished)
"расположил" к применению (может версии постарше ????!!!!)

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

я же вам не это советовал

вот простой пример создания окна - тынц . У вас окно будет ещё проще, ничего делать не надо кроме обработки одного сообщения и инициализации нулями практически всего "класса окна"

Код: plaintext
0, // parent window
вместо 0 (это десктоп) делаете HWND_MESSAGE

при выходе, в обратном порядке финализируете

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

2. какой Application.OnMessage ? кто его вызывать будет в чужом приложении?

3. а что за приложение то? может там у вас вообще какое-ни будь нетовское приложение и будет кидать вашу нить обработки по всем потокам
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39879089
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XПервичный синтаксис немного удивил .... но передать СВОЙ тип параметра (TWmFinished)
"расположил" к применению (может версии постарше ????!!!!)
Спасибо
В обработчиках сообщений всегда передаётся TMessage. Все остальные TWmXxx* созданы только для того чтобы удобнее было интерпретировать параметры. Если вы на на их посмотрите, то увидите что это по-факту те же TMessage, только параметры называются по-разному и, иногда, разбиты на более мелкие (т.е. вместо одного Integer поля стоят два SmallInt, например).
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39879094
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpВ обработчиках сообщений всегда передаётся TMessage
Чуть иначе. Передается только Word (команда), а что за ним следует - может быть чем угодно. См. TObject.Dispatch
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39879168
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanalekcvpВ обработчиках сообщений всегда передаётся TMessage
Чуть иначе. Передается только Word (команда), а что за ним следует - может быть чем угодно. См. TObject.Dispatch
TObject.Dispatch анализирует только первые два байта и передаёт дальше. Я с удовольствием посмотрю на код, который передаёт сообщение не с WPARAM/LPARAM, а с какой-нибудь TXXMessage нестандартного размера, учитывая что последнее поле там - LRESULT.
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39879181
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpЯ с удовольствием посмотрю на код, который передаёт сообщение не с WPARAM/LPARAM
Например:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
    PThreadMessage = ^TThreadMessage;
    TThreadMessage = record
        Message: MessageWord;
        WParam: Word;
        LParam: NativeInt;
        Sender: TWThread;
    end;
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39879432
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanalekcvpЯ с удовольствием посмотрю на код, который передаёт сообщение не с WPARAM/LPARAM
Например:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
    PThreadMessage = ^TThreadMessage;
    TThreadMessage = record
        Message: MessageWord;
        WParam: Word;
        LParam: NativeInt;
        Sender: TWThread;
    end;


Замечательно. Как вы это сообщение теперь в другое окно передадите? Чтобы оно его обработало?
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39879470
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpwadmanпропущено...

Например:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
    PThreadMessage = ^TThreadMessage;
    TThreadMessage = record
        Message: MessageWord;
        WParam: Word;
        LParam: NativeInt;
        Sender: TWThread;
    end;



Замечательно. Как вы это сообщение теперь в другое окно передадите? Чтобы оно его обработало?
Если быть точным, то виндовыми апи это (и многое другое) можно передать доработав обработчик WndProc.
Методу Dispatch доработки не нужны, он любую структуру толкает дальше.

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

не флеймите попусту
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39879650
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)не флеймите попусту
Хорошо, постараемся.
kealon(Ruslan)да так же приведением и передаст, если выравнивание дефолтное не выключит
Через PostMessage?
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39879672
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

не задавай глупые вопросы, ты же уже описал как в VCL сабклассится виндовая проца
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39879679
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)не задавай глупые вопросы, ты же уже описал как в VCL сабклассится виндовая проца
Вопрос глупый, но ответа нет?

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

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

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

просто глупые вопросы задаёшь, из разряда "какой рукой опу вытираешь"

написал структуру под получение результата и спрашиваешь "как передать?"
ну указателем передай, через что нить типа SendMessageCallback, с контролем удаления

способов полно

цель то, какая?
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39879786
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)цель то, какая?
Мы с алексом обсудили в пару итераций, закончили, но ты решил вмешаться.
Я думал есть какая-то иная мысль, но её не видно, только какое-то недовольство и указки кому и что думать и спрашивать.
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39879838
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

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

Спасибо за совет относительно функции BeginThread
Она в полном объему удовлетворила мои потребности
Работоспособность и функциональность
основного потока -> DLL -> объекта -> "и того же объекта" "завернутого" в BeginThread
полная и без провалов в памяти
Т.е. в качестве LParam я передал ссылку на Self его же передаю PostMessage-ом в вызывающий
поток, где с успехом Free-ю.
Поле объекта - как поток - ликвидирован
Класс - ловушка события - ликвидирован

Читабельность и архитектур. кода заметно повысилась.

Спасибо
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39882977
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,
Т.е. в качестве LParam я передал ссылку на Self его же передаю PostMessage-ом в вызывающий
PostMessage не дает гарантии, что у тебя сообщение придет в отличие от SendMessage.
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39883100
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014PostMessage не дает гарантии, что у тебя сообщение придет

А куда оно денется? Не по UDP же оно пойдёт...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39883279
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovziv-2014PostMessage не дает гарантии, что у тебя сообщение придет

А куда оно денется? Не по UDP же оно пойдёт...

Очередь оконных сообщений переполнится и прощай сообщения, уходя, не прощаются :)
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39883300
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014Очередь оконных сообщений переполнится

Для этого надо чтобы криворукий программист перестал крутить цикл их обработки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39883394
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014Dimitry Sibiryakovпропущено...

А куда оно денется? Не по UDP же оно пойдёт...

Очередь оконных сообщений переполнится и прощай сообщения, уходя, не прощаются :)
Хоть раз сталкивался с этим?
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39883432
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanziv-2014пропущено...

Очередь оконных сообщений переполнится и прощай сообщения, уходя, не прощаются :)
Хоть раз сталкивался с этим?
Причем здесь сталкивался или не сталкивался. Главное, что в MSDN написано, что PostMessage не гарантирует отсылку сообщения. А человек на основании этого сообщения какие-то действия по очистке проводит, в итоге может получить утечки или не закрытые handles. Это плохой стиль программирования. А использовать он будет в VBA, а приложения из офиса частенько могут зависать.
...
Рейтинг: 0 / 0
DLL - Thread и безудержный секс
    #39883454
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovДля этого надо чтобы криворукий программист перестал крутить цикл их обработки.

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


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