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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2008, 01:13   #1
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию DLL, потоки

Вообщем проблема встала именно так, как и написано в названии темы Разработал форму, на ней скажем кнопка и по нажатию на нее создаеться поток (класс) унаследованный от TThread для загрузки файла из инетрнета... Все начинает работать программа не чувствует никаких тормозов все ОК.... Так вот если создавать ехе и использовать данную форму то все работает на ура, но как только я эту форму кидаю в длл поток вроде и начинает работать, но куда то все события деваются, вообщем говоря работает не так как в exe Вопрос по теории - может кто знает почему так и какое может решение логичное есть ? p.s. буду продолжать проходить по процедурам может найду место где все и случается

методом ShowMessage понял что если в длл то поток даже не начинает работать не происходит процедура Execute.... объясните не знающему, как реализовать работу потоков в длл?

Последний раз редактировалось BOBAH13; 25.02.2008 в 01:18.
BOBAH13 вне форума Ответить с цитированием
Старый 25.02.2008, 01:31   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Вот, как мне кажется, полезная для вас информация:
http://megalib.com/books/27/html/dll/other/other8.htm
mihali4 вне форума Ответить с цитированием
Старый 25.02.2008, 08:17   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вова, я может не в тему, но почему бы поток не организовать на АПИ, вместо VCLника?

Вот кстати попробовал так слегка особо не задумываясь в D6:

Главный проект:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  procedure stop; external 'project2.dll';
var
  Form1: TForm1;

implementation

{$R *.dfm}

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

end.
DLL
Код:
library Project2;
uses
  SysUtils,
  windows,
  Classes,
  Unit2 in 'Unit2.pas';

var t:MThr;
{$R *.res}

 procedure stop;begin t.Terminate; end;

exports stop;
begin
 t:=MThr.Create(false);
end.
Обьект-поток
Код:
unit Unit2;

interface

uses    windows,SysUtils,
  Classes;

type
  MThr = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

implementation

{ Important: Methods and properties of objects in VCL or CLX can only be used
  in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure MThr.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }

{ MThr }

procedure MThr.Execute;
begin
  { Place thread code here }
     while true do begin
    SetWindowText(GetForegroundWindow,pchar(TimeToStr(time)));
   end;

end;

end.
Я правда с его остановкой не возился, но Execute выполняется путево
I'm learning to live...

Последний раз редактировалось Stilet; 25.02.2008 в 08:32.
Stilet вне форума Ответить с цитированием
Старый 25.02.2008, 09:25   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Вот попробывал упростить свою систему с потоками... получилось что... он начинает вроде работать потом у меня в конце тела Execute вызывается синхронизованно событие конца потока оно у меня не обрабатывается... Вообщем я даже не пойму в чем дело... Наверное попробую свой класс реализовать на api - поток... Посмотрим что получиться, вечером думаю отпишусь
BOBAH13 вне форума Ответить с цитированием
Старый 25.02.2008, 09:44   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Тут можно только одно сказать: Код в студию...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.02.2008, 09:49   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Согласен со Stilet'ом. Без кода вообще непонятно о чём речь, хотя и есть подозрения. И потом, господа, уточните такой вопрос, я прекрасно помню, что раньше про VCL писали, что её категорически нельзя использовать в DLL, а вместо этого нужно делать BPL. Что-то изменилось с тех пор?
B_N вне форума Ответить с цитированием
Старый 25.02.2008, 11:29   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да ничего не изменилось, кто кричал что VCL в ДЛЛ нельзя продолжают настаивать на этом, а другие, типа меня кто ни разу не нарвался на проблемы VCLок в библах непонимая первых продолжают нормательно кодить так как удобно а не как популярно.
Помоему это больше дело вкуса чем правильности
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.02.2008, 18:59   #8
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Я тут так подумал... Решил что пойду наверное путем bpl - мне всеравно эти длл только для моей проги будут нужны + еще почитал статью http://www.terabayt.com/plagin_inf.htm понравился момент с интерфейсами ( сам лично еще не делал bpl ). Спасибо за подсказки
BOBAH13 вне форума Ответить с цитированием
Старый 25.02.2008, 19:44   #9
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Я тут так подумал... Решил что пойду наверное путем bpl - мне всеравно эти длл только для моей проги будут нужны + еще почитал статью http://www.terabayt.com/plagin_inf.htm понравился момент с интерфейсами ( сам лично еще не делал bpl ). Спасибо за подсказки
Вы всё-таки лучше еще раз подумайте, может быть всё-таки DLL? Честно говоря, когда видишь подход Борланда к реализации TThread, начинаешь подозревать, что "у них" тоже бывает конец квартала и почему многие из пишущих на Дельфи бегут от потоков как чёрт от ладана. Один этот "Синкронайз" чего стоит, а то что VCL практически целиком не thread-safe, вообще никуда не годится. А BPL, по-моему, просто способ Борланда пригвоздить программиста к своему продукту: куда потом с этой бэпээлькой, кроме как в Дельфи... Так что я полностью поддерживаю Stilet'а - лучше писать dll на API, благо этот момент весьма добротно документирован и никаких особых подводных камней не содержит.
B_N вне форума Ответить с цитированием
Старый 25.02.2008, 23:19   #10
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

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

Код:
TWinThread = class
  private
    FHandle: THandle;
    FThreadID: THandle;
    FTerminated: Boolean;
    FFinished: Boolean;
    FCreateSuspended: Boolean;
    FSection: TRTLCriticalSection;
  protected
    procedure Execute; virtual; abstract;
  public
    constructor Create(CreateSuspended: Boolean);
    destructor Destroy; override;

    procedure Resume;
    procedure Enter;
    procedure Leave;

    property Terminated: Boolean read FTerminated write FTerminated;
    property Finished: Boolean read FFinished;
  end;

...

{ TWinThread }

function ThreadProc(Thread: TWinThread): Integer; stdcall;
begin
  if not Thread.FTerminated then
  begin
    Thread.Enter;
    Thread.Execute;
    Thread.Leave;
  end;
  Thread.FFinished := True;
  Thread.Free;
  Result := 0;
  ExitThread(Result);
end;

constructor TWinThread.Create;
const
  _Prop: array[Boolean] of Integer = (0, CREATE_SUSPENDED);
begin
  inherited Create;
  InitializeCriticalSection(FSection);
  FCreateSuspended := CreateSuspended;
  FHandle := CreateThread(NIL, 0, @ThreadProc, Pointer(Self),
    _Prop[FCreateSuspended], FThreadID);
end;

destructor TWinThread.Destroy;
begin
  DeleteCriticalSection(FSection);
  if FHandle <> 0 then
    CloseHandle(FHandle);
  inherited;
end;

procedure TWinThread.Resume;
begin
  if FCreateSuspended then
  begin
    FCreateSuspended := False;
    ResumeThread(FHandle);
  end;
end;

procedure TWinThread.Enter;
begin
  EnterCriticalSection(FSection);
end;

procedure TWinThread.Leave;
begin
  LeaveCriticalSection(FSection);
end;
и еще... получилось так что все что в коде execute ненадо вызывать синхронизацию... правда если вызвать messagebox то ошибка странная вылетает

Последний раз редактировалось BOBAH13; 25.02.2008 в 23:22.
BOBAH13 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потоки AidarBik Win Api 2 04.08.2008 10:00
Потоки в Delphi frai Общие вопросы Delphi 4 13.01.2008 03:39
Потоки в С Raptor Помощь студентам 1 07.01.2008 21:12
Потоки и объекты OrdJONY Общие вопросы Delphi 3 28.11.2007 21:59