powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DLL - Thread и безудержный секс
25 сообщений из 89, страница 3 из 4
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
25 сообщений из 89, страница 3 из 4
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DLL - Thread и безудержный секс
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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