Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Dll и TThread [D5, D7, WinXP]


Страницы:   1 2 3 4 5 6 7 8 9

dms_main ©   (2004-10-29 10:02:00) 

Уважаемые мастера, обнаружил такой глюк.
Есть класс на основе стандартного Tthread,
креатится так:

constructor tmythread.create;
begin
   inherited create(false);
end;

Проблема в том , что в dll невызывается execute, хотя в console Application все работало замечательно.
Как лечить?


dms_main   (2004-10-29 15:26:00) [101]


library finer_lib;

uses
 SysUtils,windows,
 Classes;

type TMyThread = class (TThread)
a:integer;
b:integer;
c:integer;
constructor create(a0,b0:integer);
destructor free;
procedure execute;override;
end;

constructor TMyThread.create(a0,b0:integer);
begin
   inherited create(false);
   a:=a0;
   b:=b0;
   FreeOnTerminate:=true;
end;

destructor TMyThread.free;
begin
   inherited free;
end;

procedure TMyThread.execute;
var
t:TstringList;
begin
  c:=a*b;
  t:=TStringList.Create;
  t.Add('Result = '+inttostr(c));
  t.SaveToFile('c:\result.nfo');
  t.Free;
end;

{$R *.RES}
procedure run;stdcall;export;
var
thread:TMyThread;
begin
thread:=TMyThread.create(2,2);
thread.WaitFor;
end;
exports run;
begin
end.

program Project1;
{$APPTYPE CONSOLE}
uses
 SysUtils,
 windows;
var
run : procedure;
handle:THandle;
begin
 readln;
 @run:=nil;
 handle:=LoadLibrary('finer_lib.dll');
 if  handle>= 32 then
       begin
       @run:=GetProcAddress(Handle,'run');
        if @run <> nil then
       run; ;
        end;
 FreeLibrary(Handle);
 writeln('ok');
 readln;
 readln;
end.



Всем спасибо - все заработало, но всетаки интересен вопрос
- реально ли запустить этот трэд в begin..end библиотеки???


Reindeer Moss Eater   (2004-10-29 15:25:00) [102]

и что из этого следует???

То, что кто-то до сих пор с ручника не снялся.


dms_main   (2004-10-29 15:23:00) [103]


> на основании чего ты уверен, что строка в конструкторе

на основании того что execute вызывается ПОСЛЕ create
кстати от темы опять уходим.....


> Все проще оказалось.
>
> Код между бегин-енд в модуле библиотеки вызывается один
> раз на весь процесс.

и что из этого следует???


Reindeer Moss Eater   (2004-10-29 15:20:00) [104]

Все проще оказалось.

Код между бегин-енд в модуле библиотеки вызывается один раз на весь процесс.


Digitman   (2004-10-29 15:17:00) [105]


> dms_main


цитирую тебя :

constructor TMyThread.create(a0,b0:integer);
begin
  inherited create(false);
  a:=a0;
  b:=b0;
  FreeOnTerminate:=true;
end;

какого шута ты делаешь
inherited create( false);

!?

ведь доп.поток при этом начинает работать практически немедленно !

на основании чего ты уверен, что строка в конструкторе

   a:=a0;

выполнится заведомо раньше, чем строка

 c:=a*b;

в теле Execute ?

мозжечком-то пошевели малясь !


dms_main   (2004-10-29 15:11:00) [106]

щас попробую..


Reindeer Moss Eater   (2004-10-29 15:09:00) [107]

Экспортируй функцию из DLL и вызывай её явно, а не полагайся на Windows


dms_main   (2004-10-29 15:07:00) [108]

так бы и сразу - а то "руки кривые","медицина бессильна".... :-(
подскажите хоть в каком направлении копать.


Reindeer Moss Eater   (2004-10-29 15:05:00) [109]

Поток грузит библиотеку. И Хендл валидный.

Но это вторичныйпоток и я не уверен, что в этом случае выполняется код между бегин и енд.
Надо поднимать литературу.


dms_main   (2004-10-29 15:02:00) [110]

Судя по тому что здесь>
inherited create(false);
  a:=a0;
  b:=b0;
  FreeOnTerminate:=true;
брэкпоинты - и на них выполнение останавливается, то грузит...


Reindeer Moss Eater   (2004-10-29 14:59:00) [111]

Код между бегин енд выполнятеся при загрузке процессом.
А выполняется ли он если библиотека грузится вторичным потоком этого процесса?


dms_main   (2004-10-29 14:54:00) [112]

возвращает хэндл....


dms_main   (2004-10-29 14:52:00) [113]


> Reindeer Moss Eater ©   (29.10.04 10:14) [4]
> Или вообще не создан экземпляр

создается - проверено дэбагом....


Reindeer Moss Eater   (2004-10-29 14:52:00) [114]

Можешь проверить.....

Для начала надо проверить результат LoadLibrary


dms_main   (2004-10-29 14:51:00) [115]

а зачем после загрузки сразу выполняется begin...end.

begin
thread:=TMyThread.create(2,2);
thread.WaitFor;
end.

Можешь проверить.....


Reindeer Moss Eater   (2004-10-29 14:50:00) [116]

Reindeer Moss Eater ©   (29.10.04 10:14) [4]
Или вообще не создан экземпляр


Reindeer Moss Eater   (2004-10-29 14:48:00) [117]

Зашибись!

А где запуск чего либо из DLL?


dms_main   (2004-10-29 14:46:00) [118]

загрузка dll-ки :

program Project1;
{$APPTYPE CONSOLE}
uses
 SysUtils,
 windows;
begin
 readln;
 LoadLibrary('finer_lib.dll');
 readln;
end.


dms_main   (2004-10-29 14:44:00) [119]

Хорошо - мы пойдем другим путем - если руки у меня кривые, то подскажите где именно:

library finer_lib;

uses
 SysUtils,windows,
 Classes;

type TMyThread = class (TThread)
a:integer;
b:integer;
c:integer;
constructor create(a0,b0:integer);
destructor free;
procedure execute;override;
end;

constructor TMyThread.create(a0,b0:integer);
begin
   inherited create(false);
   a:=a0;
   b:=b0;
   FreeOnTerminate:=true;
end;

destructor TMyThread.free;
begin
   inherited free;
end;

procedure TMyThread.execute;
var
t:TstringList;
begin
  c:=a*b;
  t:=TStringList.Create;
  t.Add('Result = '+inttostr(c));
  t.SaveToFile('c:\result.nfo');
  t.Free;
end;

{$R *.RES}
var
thread:TMyThread;
begin
thread:=TMyThread.create(2,2);
thread.WaitFor;
end.

Execute попрежнему не вызывается.....


sniknik   (2004-10-29 11:23:00) [120]

> Иногда и медицина бессильна
ага, и тогда больной выживает. ;о)) (в смысле глюк, в этом случае)


Страницы:   1 2 3 4 5 6 7 8 9

Наверх

Титульная страница Поиск, карта сайта Написать письмо