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

Вниз

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

Наверх




Память: 0.81 MB
Время: 0.05 c
6-1094458503
Cuest
2004-09-06 12:15
2004.11.14
TTelefoon


4-1096864284
Сергей Ю.
2004-10-04 08:31
2004.11.14
Проблема с SetForegroundWindows


1-1098877184
Pentium133
2004-10-27 15:39
2004.11.14
А вот проблема с TComboBox


14-1098805148
Сайбель Алексей
2004-10-26 19:39
2004.11.14
Клещ


3-1097640812
sapsi
2004-10-13 08:13
2004.11.14
Раскрашивание грида





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский