Форум: "Основная";
Текущий архив: 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 всекцию после beginTMyThread.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