![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Dll и TThread [D5, D7, WinXP]
dms_main © (2004-10-29 10:02:00)
Страницы: < 1 2 3 4 5 6 7 8 9 >
Уважаемые мастера, обнаружил такой глюк.
Есть класс на основе стандартного 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 - тоесть без экспорта работать небудет?(файла то создаваемого нет)