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

Вниз

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

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

>dms_main ©   (29.10.04 16:44)

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


 
dms_main ©   (2004-10-29 16:46) [121]


> >Reindeer Moss Eater ©   (29.10.04 16:40)
>
> И что же ей мешает?
>
> Я думаю, возникающий Exception, в результате чего процесс
> успешно терминируется системой вместе с вновь созданным(или
> не успевшим создаться) потоком.

Странно - никаких исключений и ошибок я не наблюдаю......


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

Добрый дядька ©

Он в IDE его отлаживает если помнишь.


 
dms_main ©   (2004-10-29 16:48) [123]

> Добрый дядька - нет исправил свой в точности с указаниями
(зачем смысл то тотже)


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

>dms_main ©   (29.10.04 16:48)
(зачем смысл то тотже)

А ты не думаешь, что у тебя может быть проблема в коде, который ты используешь? Например, при работе с файлом?


 
dms_main ©   (2004-10-29 16:50) [125]

Мастера - насчет отладки - в execute создается файл - нету этого файла - несоздается он > execute не выполняется.


 
dms_main ©   (2004-10-29 16:51) [126]

В console Application тотже код работает без проблем.


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

Парень, сколько раз можно повторять, что у тебя не создается экземпляр, потому и нет execute.

А в отладчике есть создание потому что IDE загружает библиотеку первая.


 
dms_main ©   (2004-10-29 16:57) [128]


> Reindeer Moss Eater ©   (29.10.04 16:54) [127]
> Парень, сколько раз можно повторять, что у тебя не создается
> экземпляр, потому и нет execute.
>
> А в отладчике есть создание потому что IDE загружает библиотеку
> первая.

ok - тоесть без экспорта работать небудет?(файла то создаваемого нет)


 
Digitman ©   (2004-10-29 16:59) [129]

я, кажись, начинаю понимать, в чем дело ..
это, видимо, известный глюк на стыке встроенного дебаггера и ВинХРю без апдейта ...

т.е. Execute-то как раз выполняется, но вот из-за глюка дебаггер не может отработать брэйкпойнт в теле поточной ф-ции

но даже если так, то MessageBox (ПЕРВОЙ же строчкой после begin в Execute)  обязан зафиксировать факт успешного старта поточной ф-ции... если, конечно же, не умудриться напортачить еще и с параметрами MessageBox..


 
dms_main ©   (2004-10-29 17:04) [130]

> Digitman ©
винда ХР со всеми патчами,D7 без мудрежа дэббагит,
нету ни файла ни месседж бокса ни меесадж бипа.


 
Digitman ©   (2004-10-29 17:09) [131]


> dms_main ©   (29.10.04 17:04) [130]


да ну не верю я !

ты что-то существенное скрываешь, то что упорно не приводишь в примерах своего кода ..

почему ты до сих пор не оттрассировал пошагово тело конструктора TThread ?


 
dms_main ©   (2004-10-29 17:15) [132]

вот те другой мой код в котором таже беда - невижу смысла выкладывать 14к кода если в 0,7к таже беда:

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(true);
   a:=a0;
   b:=b0;
  // FreeOnTerminate:=true;
   resume;

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
delete
thread:=TMyThread.create(2,2);
thread.WaitFor;
end.


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

Так тоже дебаггер не заходит в поточную функцию?


library ThrDll;

uses
 windows;

type
 TParm=record
   X,Y: Integer;
 end;
var
 Parm: TParm;
 ThreadId: THandle;

procedure ThreadFunc(aParm: Pointer); cdecl;
var
 i: Integer;
begin
 for i := 0 to TParm(aParm^).X do
 begin
   Write("Test"+#13#10);
 end;
end;

begin
 Parm.X := 2;
 Parm.Y := 2;
 CreateThread(nil,0,@ThreadFunc,@Parm,0,ThreadId);
end.


 
Reindeer Moss Eater ©   (2004-10-29 17:18) [134]

Код приглашенного актера прекрасно работает в консольном приложении (читай - в однопоточном) - давайте верить в это.

В многопоточном не работает как надо. - давайте тоже верить в это.

Значит где трабл зарыт?
Правильно. В особенности парочки DLL + вторичный поток.

Не понимаю, как можно в течении 130 постов обсуждать очевидное.


 
dms_main ©   (2004-10-29 17:18) [135]

Добрый дядька © >
это - совершенно другая песня здесь заходит.


 
Digitman ©   (2004-10-29 17:19) [136]


> dms_main ©   (29.10.04 17:15) [132]


и долго ты еще будешь постить сюда один и тот же код в разных вариациях ?

я тебе вопрос задал - ЧТО показала пошаговая трассировка TThread.Create() ?


 
dms_main ©   (2004-10-29 17:20) [137]

Reindeer Moss Eater © > несогласен только с одним - "приглашенный актер" интересно это к чему? :-(


 
Reindeer Moss Eater ©   (2004-10-29 17:21) [138]

ЧТО показала пошаговая трассировка TThread.Create() ?

Ничего полезного она не покажет.

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


 
dms_main ©   (2004-10-29 17:21) [139]


> Digitman ©

весь код который в create выполнился, в execute не заходит.


 
Reindeer Moss Eater ©   (2004-10-29 17:24) [140]

Reindeer Moss Eater © > несогласен только с одним - "приглашенный актер" интересно это к чему? :-(

Потому что программер на форуме решает реальные проблемы, а приглашенный актер играет роль.


 
Digitman ©   (2004-10-29 17:25) [141]


> Reindeer Moss Eater ©   (29.10.04 17:18) [134]


что-то я тебя не понял ..
какая разница, откуда будет вызвана в дан.случае LoadLibrary - из основного или доп.трэда хост-процесса ? та же CreateThread в конечном итоге вызывается, что мешает ее успешному выполнению, даже если вызвана она из доп.трэда ?

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

или ты намекаешь на то, что до CreateThread даже дело не доходит ? но в Д5, по кр.мере, обязано доходить !


 
dms_main ©   (2004-10-29 17:26) [142]


> Reindeer Moss Eater ©

то есть получается я от нефиг делать тут весь день торчу ? :-(

> Потому что программер на форуме решает реальные проблемы

и трабла моя вымышлена?


 
Reindeer Moss Eater ©   (2004-10-29 17:28) [143]

Разница такая.

Мы ставим BP.
И мы попадем на эту BP.
Но это не та нить, которую мы отлаживаем.

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

Точка останова есть, и мы туда попадаем.
Но только не тогда, когда вторичный поток делает LoadLobrary


 
dms_main ©   (2004-10-29 17:30) [144]


> Но только не тогда, когда вторичный поток делает LoadLobrary

Я это все давно понял - можно не повторяться.
Лечиться это или нет - вот в чем вопрос.


 
dms_main ©   (2004-10-29 17:30) [145]


> Но только не тогда, когда вторичный поток делает LoadLobrary

Я это все давно понял - можно не повторяться.
Лечиться это или нет - вот в чем вопрос.


 
Reindeer Moss Eater ©   (2004-10-29 17:32) [146]

Лечиться это или нет - вот в чем вопрос.

Устал я. Домой иду.


 
Digitman ©   (2004-10-29 17:35) [147]


> Reindeer Moss Eater ©   (29.10.04 17:21) [138]


с какой стати отладчик автоматом загрузит ДЛЛ, если она в хост-приложении грузится искл-но динамически ? и если никаких Reload Symbol Table и иже с ним сомнительных фич не задействовать явно ?


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

>dms_main ©   (29.10.04 17:30)
WAitFor убери. Совсем.


 
Reindeer Moss Eater ©   (2004-10-29 17:41) [149]

с какой стати отладчик автоматом загрузит ДЛЛ, если она в хост-приложении грузится искл-но динамически ?
Динамически. Да.
Но не из единственного потока.

какая разница, откуда будет вызвана в дан.случае LoadLibrary - из основного или доп.трэда хост-процесса ?

Никакой разницы нет. Можно из основного, можно из вторичного.

Разница есть какой поток делает это первым в процессе.

Потому что у него код создания потока, создающего файлы привязан к блоку begin/end библиотеки.

А блок этот вызывается один раз за весть процесс сколько бы ни вызывали LoadLibrary в этом процессе.

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


 
Reindeer Moss Eater ©   (2004-10-29 17:52) [150]

И вообще не понятно, откуда берутся параметры для конструктора того потока, если его запуск заточен под автоматическое выполнение кода между begin/end библиотеки при простой загрузке библиотеки.

Получается, что они вообще хардкодед.


 
Defunct ©   (2004-10-29 19:07) [151]

Ну и развели..

Надо было сказать:

> Лечиться это или нет - вот в чем вопрос.

Лечится только в военном госпитале.


 
Reindeer Moss Eater ©   (2004-11-01 10:40) [152]

Что бы "работало" без экспорта

library lib;

uses Windows;
{$R *.res}

procedure DllProcedure(AReason : integer);
begin
case AReason of
 DLL_PROCESS_ATTACH,
 DLL_THREAD_ATTACH  : begin
                       //Создание экземпляров TThread
                       ....  
                      end;
 DLL_PROCESS_DETACH :;
 DLL_THREAD_DETACH  :;
end;
end;

begin
DllProc := DllProcedure;
DllProc(DLL_PROCESS_ATTACH);
end.


 
Digitman ©   (2004-11-01 11:50) [153]


> Reindeer Moss Eater ©   (29.10.04 17:41) [149]


DLL_THREAD_ATTACH здесь к делу никоим образом не относится

как только любой трэд процесса в самый первый раз будет грузить ДЛЛ (явно или неявно), системой будет вызвана DllEntryPoint(DLL_PROCESS_ATTACH), что в конечном счете должно привести к передаче управления в блок begin..end библиотеки, где у автора вызывается конструктор TMyThread.Create (он и вызывается в действительности - автор это подтверждает) .. если в ходе работы конструктора не возникло исключений, то поточная ф-ция обязана стартовать и вызвать при этом Execute, и брейкпойнт в самом начале тела Execute ну просто обязан быть пойманным отладчиком ..


 
DiamondShark ©   (2004-11-01 12:41) [154]

Балин...
Любите хелп -- источник знаний:

During process startup and DLL initialization routines, new threads can be created, but they do not begin execution until DLL initialization is done for the process.


 
Reindeer Moss Eater ©   (2004-11-01 12:43) [155]

Он (автор) хочет, что бы бегин/енд выполнялся при LoadLibrary из любого потока хост приложения.

Он не хочет ничего экспортировать, но хочет автоматического выполнения кода при загрузке.


 
Reindeer Moss Eater ©   (2004-11-01 12:57) [156]

DiamondShark ©

Любите источник знаний целиком и до конца.
Все это касается статического импорта библиотеки.
Если импорт динамический, то вторичному потоку ничто не помешает ни выполняться, ни самому грузить dll первее главного треда


 
Digitman ©   (2004-11-01 12:57) [157]


> Reindeer Moss Eater ©   (01.11.04 12:43) [155]


я ОДНОГО не понял - автор утверждает, что ВР в теле Execute он ВООБЩЕ не ловит в ходе самого первого обращения к ДЛЛ ... хотя тело конструктора хотя бы однократно получает управление ...

этого быть не может - рано или поздно поточная ф-ция все равно стартует


> DiamondShark ©   (01.11.04 12:41) [154]


ну и что ? рано или поздно ВР должна сработать !


 
DiamondShark ©   (2004-11-01 13:04) [158]


> Reindeer Moss Eater ©   (01.11.04 12:57) [156]

Это ты к чему?


> Digitman ©   (01.11.04 12:57) [157]
> ну и что ? рано или поздно ВР должна сработать !

Не-а. У него там WaitFor стоит.


 
DiamondShark ©   (2004-11-01 13:14) [159]

Объясняю.

Вызываем LoadLidrary, LoadLidrary не возвращается, пока не отработает DLL entry point.
В DLL entry point создаётся поток, который будет подвешен, пока не завершится DLL entry point.
К контексте DLL entry point вызывается поток.WaitFor, которая не вернётся, пока не закончится поток, который не запустится пока не закончится DLL entry point, которая не закончится пока не вернётся WaitFor... в доме который построил Джек.

Если убрать WaitFor, то поток начнёт работь сразу, как вернётся DLL entry point. Тут, правда автором заботливо подложены другие грабли в виде FreeLibrary сразу после LoadLibrary.


 
Юрий Зотов ©   (2004-11-01 13:22) [160]

Всю ветку читать не стал - слишком длинная. Поэтому просто скажу, в чем тут, похоже, дело и сорри, если повторю кого-то или скажу "не в кассу".

Проблема XP-DLL-отладчик известная (хоть в однопоточном, хоть в многопоточном приложении). По какой-то причине отладчик не подгружает отладочную символьную информацию из DLL и поэтому брейкпойнты в DLL не срабатывают (хотя код работает). Лечится это либо установкой эксперта IDE (встречал в сети, но где - не помню), либо так.

1. В DLL сразу после главного begin пишем любой MesssageBox  -что угодно, лишь бы тормознуть программу.

2. Когда этот MessageBox появится, переключаемся в Delphi, жмем Ctrl-Alt-M, в появившемся окне (слева внизу) находим свою DLL, жмакаем по ней правой кнопкой мыши и выбираем Reload Symbol Table. Если все прошло ОК, то справа увидим, что отладочная информация подгрузилась.

3. В MessageBox жмем OK - теперь брейкпойнты должны работать.



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

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

Наверх




Память: 0.83 MB
Время: 0.059 c
4-1096874938
onyx
2004-10-04 11:28
2004.11.14
Прозрачное окно в Win 9x


1-1098953333
Mishenka
2004-10-28 12:48
2004.11.14
Правый пункт в MainMenu


4-1097004335
Comp
2004-10-05 23:25
2004.11.14
Не появляются подсказки TOOLTIP на TOOLBAR


14-1098442162
Opilki_Inside
2004-10-22 14:49
2004.11.14
Перевод ASCII - графики в RTF,HTML,DOC...


4-1096898356
Delphis
2004-10-04 17:59
2004.11.14
Смена обоев