Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Dll и TThread [D5, D7, WinXP]


Страницы:   1 2 3 4 5 6 7 8 9

dms_main ©   (2004-10-29 10:02:00) 

Уважаемые мастера, обнаружил такой глюк.
Есть класс на основе стандартного Tthread,
креатится так:

constructor tmythread.create;
begin
   inherited create(false);
end;

Проблема в том , что в dll невызывается execute, хотя в console Application все работало замечательно.
Как лечить?


Digitman   (2004-10-29 17:35:00) [21]


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


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


Reindeer Moss Eater   (2004-10-29 17:32:00) [22]

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

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


dms_main   (2004-10-29 17:30:00) [23]


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

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


dms_main   (2004-10-29 17:30:00) [24]


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

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


Reindeer Moss Eater   (2004-10-29 17:28:00) [25]

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

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

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

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


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


> Reindeer Moss Eater ©

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

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

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


Digitman   (2004-10-29 17:25:00) [27]


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


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

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

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


Reindeer Moss Eater   (2004-10-29 17:24:00) [28]

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

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


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

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

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

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


dms_main   (2004-10-29 17:21:00) [30]


> Digitman ©

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


dms_main   (2004-10-29 17:20:00) [31]

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


Digitman   (2004-10-29 17:19:00) [32]


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


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

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


dms_main   (2004-10-29 17:18:00) [33]

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


Reindeer Moss Eater   (2004-10-29 17:18:00) [34]

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

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

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

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


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

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


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.


dms_main   (2004-10-29 17:15:00) [36]

вот те другой мой код в котором таже беда - невижу смысла выкладывать 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.


Digitman   (2004-10-29 17:09:00) [37]


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


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

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

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


dms_main   (2004-10-29 17:04:00) [38]

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


Digitman   (2004-10-29 16:59:00) [39]

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

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

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


dms_main   (2004-10-29 16:57:00) [40]


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

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


Страницы:   1 2 3 4 5 6 7 8 9

Наверх

Титульная страница Поиск, карта сайта Написать письмо