Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.11.2019, 22:12
darkwellroad darkwellroad вне форума
Прохожий
 
Регистрация: 30.08.2013
Сообщения: 6
Версия Delphi: Delphi XE4
Репутация: 10
Вопрос Вызов одной DLL из нескольких потоков

Привет всем. Не спрашивайте зачем

При создании одного потока - все работает прекрасно и без ошибок. Если потоков 2 и больше - либо вылетает, либо сыпется различного рода ошибками, типа EAccessViolation или EInvalidPointer. Буду очень благодарен, если направите мысли в нужное русло! Всем спасибо!

Код DLL:
Код:
library gear;
 
uses
  System.SysUtils,
  System.Net.HttpClientComponent,
  System.Net.HttpClient,
  System.Net.URLClient;
 
{$R *.res}
 
function Execute: Integer; stdcall;
var
  PResponse: IHTTPResponse;
begin
  with TNetHTTPClient.Create(nil) do
    try
      PResponse := GET('https://www.google.com/');
      Result := PResponse.StatusCode;
    finally
      PResponse := nil;
      free
    end;
end;
 
exports Execute;
 
begin
 
end.
Код потока:
Код:
unit TestThreadUnit;
 
interface
 
uses
  Windows,
  SysUtils,
  Classes;
 
type
  TExecute = function(): Integer;
 
  TestThread = class(TThread)
  protected
    I: Integer;
    procedure Execute; override;
  public
    constructor Create;
    procedure Sync;
  end;
 
implementation
 
uses TestUnit;
 
constructor TestThread.Create;
begin
  inherited Create(false);
end;
 
 
procedure TestThread.Execute;
var
  hndDLLHandle: THandle;
  Ex: TExecute;
begin
  try
    hndDLLHandle := loadLibrary('gear.dll');
    if hndDLLHandle <> 0 then
      begin
        @Ex := getProcAddress(hndDLLHandle, 'Execute');
        if addr(Ex) <> nil then
          I := Ex()
        else
          I := -1;
      end
    else
      I := -1;
  finally
    freeLibrary(hndDLLHandle);
    Synchronize(Sync);
  end;
end;
 
procedure TestThread.Sync;
begin
  TestForm.Memo1.Lines.Add(I.ToString);
end;
 
end.
Работаю так:
Код:
unit TestUnit;
 
interface
 
uses
 
  System.Classes,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.StdCtrls;
 
type
 
  TTestForm = class(TForm)
    ThreadButton: TButton;
    Memo1: TMemo;
    procedure ThreadButtonClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  TestForm: TTestForm;
 
implementation
 
uses TestThreadUnit;
 
{$R *.dfm}
 
procedure TTestForm.ThreadButtonClick(Sender: TObject);
var
  m: integer;
begin
  // for m := 0 to 1 do
  TestThread.Create.FreeOnTerminate := true;
end;
 
end.
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:46.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter