Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.68 MB
Время: 0.045 c
3-1097867801
Zif
2004-10-15 23:16
2004.11.14
Как записать путь к файлу в БД, используя OpenDialog?


14-1098697906
Миша Белкин
2004-10-25 13:51
2004.11.14
C# or Delphi and .Net прекрасный дует?


14-1098954327
dr Tr0jan
2004-10-28 13:05
2004.11.14
Разница между GMT и Московским временем


1-1099041836
Tom
2004-10-29 13:23
2004.11.14
Рисую на форме в Run Time...


3-1098165896
tradakad
2004-10-19 10:04
2004.11.14
Delphi + Mysql проблема сортировки данных





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский