Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.14;
Скачать: CL | DM;

Вниз

Dll и TThread   Найти похожие ветки 

 
dms_main ©   (2004-10-29 15:42) [80]


> просто вызови конструктор трэда в теле begin..end библиотеки.
> что этому мешает ?

А я что сделал?

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


 
Digitman ©   (2004-10-29 15:46) [81]


> dms_main ©   (29.10.04 15:42) [80]


> А я что сделал?


и что ? и продолжаешь утверждать, что управление методу Execute не передается в ходе старта трэда ?


 
Добрый дядька ©   (2004-10-29 15:48) [82]

>dms_main

Вопрос:

Зачем нужна такая библиотека, которая загружается в приложение, выполняя код один раз, затем висит, занимая ресурсы?


 
dms_main ©   (2004-10-29 15:48) [83]

ДА именно так
Делаю LoadLibrary - креатиться, а execute не вызывается - из-за этого и вся проблема.


 
Reindeer Moss Eater ©   (2004-10-29 15:50) [84]

Который поток первый загрузил DLL - того и тапки.
Для него и будет выполнен код между begin/end.

Остальные отдыхают.


 
dms_main ©   (2004-10-29 15:53) [85]


> Который поток первый загрузил DLL - того и тапки.
> Для него и будет выполнен код между begin/end.
>
> Остальные отдыхают.

это все понятно - begin..end - вызывается 1 раз
при loadlibrary выполняется begin..end? креатится трэд, прыгает на Waitfor и ждет пока тред завершится - а метод execute в трэде так и не вызывается.... :-(


 
Digitman ©   (2004-10-29 15:54) [86]


> dms_main ©   (29.10.04 15:48) [83]


ерунду не городи.

ставь брейкпойнты на строчках

 c:=a*b;

и

 thread:=TMyThread.create(2,2);

и лови эти брейкпойнты !

и попробуй только сказать, что ни один из них не "ловится"


 
Reindeer Moss Eater ©   (2004-10-29 15:55) [87]

при loadlibrary выполняется begin..end?

Чё, еще раз?
Ну давай еще один раз:

Сто раз вызови LoadLibrary - код межу begin end выполнится ровно один раз.


 
dms_main ©   (2004-10-29 15:57) [88]


> ерунду не городи.
>
> ставь брейкпойнты на строчках
>
>  c:=a*b;
>
> и
>
>  thread:=TMyThread.create(2,2);
>
> и лови эти брейкпойнты !
>
> и попробуй только сказать, что ни один из них не "ловится"

именно это и говорю......
И вообще тема разговора именно эта!!!
не веришь - скомпиляй код (сообщение 67) - без экспорта и
через loadlibrary.....


 
dms_main ©   (2004-10-29 15:59) [89]


> Чё, еще раз?
> Ну давай еще один раз:
>
> Сто раз вызови LoadLibrary - код межу begin end выполнится
> ровно один раз.

спасибо - это я уже давно понял...... оно и вызывается 1 раз  - креатит но execute не вызывает....


 
Reindeer Moss Eater ©   (2004-10-29 16:00) [90]

креатит но execute не вызывает....

Это потому что хэллоуин на носу.
Подожди до понедельника, будет тебе execute


 
Digitman ©   (2004-10-29 16:00) [91]


> без экспорта


да экспорт-то тут причем ?!
хоть он есть, хоть его нет - ну никак это не влияет на сабж !


> не веришь


представь себе - не верю !
и даже проверять не буду ..
и глубоко фиолетово к тому же, КАК грузится твоя ДЛЛ - статически или динамически ..

давай-ка рассказывай, как ты "ловишь" брейкпойнты ..


 
dms_main ©   (2004-10-29 16:03) [92]

Run>Parameters>Host Application>F9
"MyLib">Reload Symbol Table


 
dms_main ©   (2004-10-29 16:18) [93]

проверить кстати можно еще проще :

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;


в "Экспортном" варианте файл создается, в Loadlibrary - не создается.


 
Добрый дядька ©   (2004-10-29 16:20) [94]

Все прекрасно работает как в таком виде:

library ThrDll;

uses
 Classes,
 windows;

type
 TMyThread=class(TThread)
   FX: String;
 protected
   procedure Execute; override;
 public
   constructor Create(const X: String);
 end;

{ MyThread }

constructor TMyThread.Create(const X: String);
begin
 inherited Create(True);
 FX := X;
 FreeOnTerminate := True;
 Resume;
 ResumeThread(Self.Handle);
end;

procedure TMyThread.Execute;
var
 i: Integer;
begin
 for i := 0 to 10 do
 begin
   Sleep(200);
   Write(FX+#13#10);
 end;
 Terminate;
end;

procedure DllMain(fdwReason:DWORD);
begin
  case fdwReason of
    DLL_THREAD_ATTACH: ;
    DLL_THREAD_DETACH: ;
    DLL_PROCESS_ATTACH:
      begin
        TMyThread.Create("Hehe");
      end;
    DLL_PROCESS_DETACH:
      begin
      end;
  end;
end;

begin
 DllProc:=@DllMain;
 DllMain(DLL_PROCESS_ATTACH);
end.


Вызывающий код:

program test;

{$APPTYPE CONSOLE}

uses
 Windows;
begin
 LoadLibrary("ThrDll.dll");
 ReadLn;
end.


так и если убрать DLLMain, а просто вставить в DLL всекцию после begin

TMyThread.CrReate("Hehe");


 
Digitman ©   (2004-10-29 16:21) [95]


> dms_main ©   (29.10.04 16:03) [92]


в Д5 в настройках Host Application нет никаких Reload Symbol Table

это раз.

второе.

ты стартовал отладку ДЛЛ, поймал брейкпойнт на строчке

thread:=TMyThread.create(2,2);

почему не прошел конструктор пошагово ?
ведь если BeginThread() выполнилась успешно, то признаков фактического старта трэда более чем достаточно !

это и ненулевой ThreadId и ненулевой Handle ... То что Handle ненулевой - это уже гарантировано, иначе WaitFor немедленно возвратил бы управление, чего, как ты говоришь, не наблюдается у тебя .. .

а если так, то рано или поздно процедура Execute обязана была бы получить управление ! Ведь поточная ф-ция успешно стартовала !


 
Добрый дядька ©   (2004-10-29 16:21) [96]

Сорри, строка ResumeThread в конструкторе не нужна.


 
dms_main ©   (2004-10-29 16:25) [97]

I>
> Все прекрасно работает как в таком виде:

как было так и есть...<


 
Добрый дядька ©   (2004-10-29 16:25) [98]

А вот ошибка в твоем коде:

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


Это первая.

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


Это вторая.


 
dms_main ©   (2004-10-29 16:26) [99]


>
> {$R *.RES}
> var
> thread:TMyThread;
> begin
> thread:=TMyThread.create(2,2);
> thread.WaitFor;
> end.
>
> Это вторая.

а если мне надо дождаться его завершения?


 
Reindeer Moss Eater ©   (2004-10-29 16:27) [100]

Добрый дядька ©   (29.10.04 16:20) [94]
Все прекрасно работает как в таком виде:


Если делать это в одном потоке.


 
Добрый дядька ©   (2004-10-29 16:28) [101]

Вторая ошибка потому, что

FreeOnTerminate:=true;

Не может использоваться с

thread.WaitFor;


 
Добрый дядька ©   (2004-10-29 16:29) [102]

>Reindeer Moss Eater ©   (29.10.04 16:27)

Если делать это в одном потоке.

По условиям задачи разве не это нужно?


 
Reindeer Moss Eater ©   (2004-10-29 16:29) [103]

Добрый дядька ©   (29.10.04 16:28) [101]

Это не объясняет феномен невызова Execute


 
Reindeer Moss Eater ©   (2004-10-29 16:30) [104]

По условиям задачи разве не это нужно?

не это нужно по условиям задачи


 
Добрый дядька ©   (2004-10-29 16:30) [105]

В случае, если нужно дождаться завершения потока, то используется FreeOnTerminate := True,
затем
WaitFor
Free

Это из-за особенностей реализации TThread


 
Reindeer Moss Eater ©   (2004-10-29 16:31) [106]

Добрый дядька ©   (29.10.04 16:30) [105]

Это не объясняет феномен невызова Execute


 
dms_main ©   (2004-10-29 16:31) [107]

Digitman ©  
сорри забыл дописать перед пелодом ctrl+alt+m


 
Digitman ©   (2004-10-29 16:33) [108]


> dms_main ©   (29.10.04 16:26) [99]


> а если мне надо дождаться его завершения?


да ёшкин кот !!

мы тут о чем говорим ? о твоем утверждении, что Execute у тебя якобы не вызывается !

какого рожна ты стрелки переводишь на не имеющее отношения к проблеме строчку ? мало ли что там у тебя торчит в коде следом за конструктором потока ! ты стартовал поток как not suspended, исключения ты не получил при вызове конструктора, значит  Execute обязан был получить управление ! И абсолютно неважно, что у тебя там стоит следующей строчкой ! Правильность логики вызова WaitFor в данноим контексте - это совершенно иной вопрос !


 
Добрый дядька ©   (2004-10-29 16:35) [109]

[103] Reindeer Moss Eater ©   (29.10.04 16:29)
Добрый дядька ©   (29.10.04 16:28) [101]

Это не объясняет феномен невызова Execute

Именно объясняет.

Поток создается с Inherited(False), поточная функция просто не успевает начать выполняться.


 
dms_main ©   (2004-10-29 16:35) [110]


> мы тут о чем говорим ? о твоем утверждении, что Execute
> у тебя якобы не вызывается !

смотри 93 мессагу


 
Digitman ©   (2004-10-29 16:36) [111]


> ctrl+alt+m


ЭТО к чему ? опять стрелки переводишь ?
какое отношение состояние открытости IDE-окна имеет к проблеме ?


 
dms_main ©   (2004-10-29 16:37) [112]


>
> ЭТО к чему ? опять стрелки переводишь ?
> какое отношение состояние открытости IDE-окна имеет к проблеме
> ?

открывается окно загруженных модулей - так в своем делаешь Reload Symbol Table


 
Reindeer Moss Eater ©   (2004-10-29 16:40) [113]

Поток создается с Inherited(False), поточная функция просто не успевает начать выполняться.

И что же ей мешает?


 
dms_main ©   (2004-10-29 16:41) [114]


> Поток создается с Inherited(False), поточная функция просто
> не успевает начать выполняться.
>
> И что же ей мешает?

Да же если create(true) а потом resume - толку нет. :-(


 
Добрый дядька ©   (2004-10-29 16:42) [115]

>Reindeer Moss Eater ©   (29.10.04 16:40)

И что же ей мешает?

Я думаю, возникающий Exception, в результате чего процесс успешно терминируется системой вместе с вновь созданным(или не успевшим создаться) потоком.


 
Добрый дядька ©   (2004-10-29 16:43) [116]

>dms_main ©   (29.10.04 16:41)

Ты мой код попробовал? Выполняется?


 
Reindeer Moss Eater ©   (2004-10-29 16:44) [117]

в результате чего процесс успешно терминируется

Что-то мы про это не слышали от приглашенного актера


 
dms_main ©   (2004-10-29 16:44) [118]


> Добрый дядька ©   (29.10.04 16:43) [116]
> >dms_main ©   (29.10.04 16:41)
>
> Ты мой код попробовал? Выполняется?

выполняется  create, а execute - нет.


 
Добрый дядька ©   (2004-10-29 16:45) [119]

>Reindeer Moss Eater ©   (29.10.04 16:44)

Что-то мы про это не слышали от приглашенного актера

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


 
Добрый дядька ©   (2004-10-29 16:46) [120]

>dms_main ©   (29.10.04 16:44)

Т.е. ты в точности создал проект с кодом библиотеки и вызовом?



Страницы: 1 2 3 4 5 вся ветка

Текущий архив: 2004.11.14;
Скачать: CL | DM;

Наверх




Память: 0.7 MB
Время: 0.06 c
4-1096206369
nomshar
2004-09-26 17:46
2004.11.14
Dll injection


1-1099106540
AZ
2004-10-30 07:22
2004.11.14
Недоступность значения свойства типа массив


3-1097723059
Marat
2004-10-14 07:04
2004.11.14
Запуск StoredProc


3-1097738780
boba
2004-10-14 11:26
2004.11.14
Проблема с параметрами в FIBQuery


8-1091640838
miek
2004-08-04 21:33
2004.11.14
GLScene: вопросы