![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Dll и TThread [D5, D7, WinXP]
dms_main © (2004-10-29 10:02:00)
Страницы: < 1 2 3 4 5 6 7 8 9 >
Уважаемые мастера, обнаружил такой глюк.
Есть класс на основе стандартного 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]> Иногда и медицина бессильна
ага, и тогда больной выживает. ;о)) (в смысле глюк, в этом случае)