Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2014, 12:02   #1
yaschenko
Пользователь
 
Аватар для yaschenko
 
Регистрация: 29.03.2014
Сообщений: 26
Вопрос Работа с потоками в dll

Доброго времени суток!
Подскажите как из dll дать понять программе что поток завершился и можно выгружать dll из памяти?

Сама dll:
Код:
ibrary Thread_dll;
uses
  SysUtils,
  Classes,Dialogs;
type
 Thread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
 end;
{$R *.res}
procedure Thread.Execute;
begin
  ShowMessage('Hello world!');
end;
procedure vizovThread;stdcall;
var T:Thread;
begin
  T:=Thread.Create;
  t.FreeOnTerminate:=True;
  T.Priority:=tpLower;
  T.Resume;
end;
exports
 vizovThread;
begin
end.
Вызов dll в программе:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var lib:THandle;
    _Thread:procedure;stdcall;
begin
lib:=LoadLibrary('Thread_dll.dll');
@_Thread:=GetProcAddress(lib,'vizovThread');
_Thread;
//FeeLibrary(lib);
end;
Отладка - это процесс осознания того, что программа делает только то, что ты написал, а не то, что ты хотел написать.
yaschenko вне форума Ответить с цитированием
Старый 03.04.2014, 17:57   #2
yaschenko
Пользователь
 
Аватар для yaschenko
 
Регистрация: 29.03.2014
Сообщений: 26
По умолчанию

Подскажите это можно реализовать с помощью PostMessage() ?
Отладка - это процесс осознания того, что программа делает только то, что ты написал, а не то, что ты хотел написать.
yaschenko вне форума Ответить с цитированием
Старый 03.04.2014, 18:25   #3
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Зачем в таком случае делать отдельный поток, если Вам всё равно нужно ждать пока он завершится?
FaTaL вне форума Ответить с цитированием
Старый 03.04.2014, 18:29   #4
Розетко
Пользователь
 
Аватар для Розетко
 
Регистрация: 05.12.2013
Сообщений: 21
По умолчанию

У TThread есть свойство FreeOnTerminate. Если оно равно true, то поток сам освободит занимаемую память при завершении.
NНOGΔΛ MHΣ KΛЖΣTСЯ, 4TO MΣHЯ HΣ ПОНNМΛЮТ :[
Розетко вне форума Ответить с цитированием
Старый 03.04.2014, 18:39   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Розетко Посмотреть сообщение
У TThread есть свойство FreeOnTerminate. Если оно равно true, то поток сам освободит занимаемую память при завершении.
в основном речь о ДЛЛ, а не о потоке.

я бы советовал вам применить АПИшные потоки, ибо им доступна функция FreeLibraryAndExitThread, которая корректно завершит поток и выгрузит ДЛЛ.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.04.2014, 20:17   #6
yaschenko
Пользователь
 
Аватар для yaschenko
 
Регистрация: 29.03.2014
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение

я бы советовал вам применить АПИшные потоки, ибо им доступна функция FreeLibraryAndExitThread, которая корректно завершит поток и выгрузит ДЛЛ.
Спасибо за совет, почитаю, надеюсь поможет.
Отладка - это процесс осознания того, что программа делает только то, что ты написал, а не то, что ты хотел написать.
yaschenko вне форума Ответить с цитированием
Старый 05.04.2014, 13:01   #7
yaschenko
Пользователь
 
Аватар для yaschenko
 
Регистрация: 29.03.2014
Сообщений: 26
По умолчанию

В dll создаю поток в котором создаётся и выводиться информация в excel это все отрабатывает нормально, а вот когда выгружаю dll из памяти возникает ошибка, Подскажите пожалуйста ,что я делаю не так?
Dll:
Код:
library OtchetK;
uses
  SysUtils, Classes, DB, ADODB, Forms,Windows, Messages,  ExcelXP, OleServer, Dialogs;
type
 Thread=class(TThread)
     private
    { Private declarations }
  protected
    procedure Execute; override;
 end;
{$R *.res}

Var AdoQ:TADOQuery; Form:TForm;
      EA:TExcelApplication;
      EW:TExcelWorkbook;
procedure Thread.Execute;
var
 i:Integer;
 n:OleVariant;
begin
try
EA:=TExcelApplication.Create(Form);
EW:=TExcelWorkbook.Create(Form);
n:=GetCurrentDir+'\Отчет.xls';
EA.Workbooks.Add(n,0);
EW.ConnectTo(EA.ActiveWorkbook);
AdoQ.First;
for I := 1 to AdoQ.RecordCount do
  begin
    EA.Cells.Item[i,1].value:=AdoQ.Fields.Fields[4].AsString;
    AdoQ.Next;
  end;
EA.Visible[0]:=True;
EW.Disconnect;
EA.Free;
EW.Free;
finally
PostMessage(Form.Handle,WM_USER+1,0,0);
end;
end;
procedure OtchetKlient(AForm:TForm;Query:TADOQuery);
var    T:Thread;
begin
AdoQ:=Query;
Form:=AForm;
t:=Thread.Create(false);
T.FreeOnTerminate:=False;
T.Priority:=tpLower;
T.Resume;
end;
exports
  OtchetKlient;
begin
end.
Код программы:
Код:
procedure TForm1.FreeDllOtchet(var Msg: TMessage);
begin
  FreeLibrary(hLib);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
hLib:=LoadLibrary('OtchetK.dll');
@_otchet:=GetProcAddress(hLib,'OtchetKlient');
_otchet(Self,ADOQuery1);
end;
Изображения
Тип файла: jpg Error.JPG (21.0 Кб, 35 просмотров)
Отладка - это процесс осознания того, что программа делает только то, что ты написал, а не то, что ты хотел написать.
yaschenko вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с потоками ThreadDelphi Общие вопросы Delphi 3 08.04.2012 18:58
Работа с потоками gagarin0 Win Api 4 05.11.2010 02:30
Работа с потоками Яр|/||< (^_^) Общие вопросы Delphi 5 09.03.2010 08:23
Работа с потоками Нюська Общие вопросы Delphi 3 27.05.2009 00:52
C++, работа с потоками mat90x Помощь студентам 20 15.05.2008 22:20