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

Вниз

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

 
dms_main ©   (2004-10-29 10:02) [0]

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

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

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


 
Sandman25 ©   (2004-10-29 10:04) [1]

В execute стоит Synchronized(MyMethod)?


 
dms_main ©   (2004-10-29 10:05) [2]

нет есть только CriticalSection....


 
Reindeer Moss Eater ©   (2004-10-29 10:12) [3]

Проблема в том , что в dll невызывается execute,
Потому что Resume не вызван


 
Reindeer Moss Eater ©   (2004-10-29 10:14) [4]

Или вообще не создан экземпляр


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

TO Reindeer Moss Eater
1.кретиться не suspended
2.креатил с suspended , потом делал resume - непомогает.....


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

все действия записанные в креате (с инкрементом threadcount(integer)) в critical section)проходят , а вот execute не вызывается....:-(


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

Чем получено знание, что Execute не вызывается?


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

дебагом


 
Reindeer Moss Eater ©   (2004-10-29 10:20) [9]

Оптимизация или неправильный "дебаг"


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

Либо все таки не вызван конструктор.
Код вызова констсруктора написан, но он не вызывается.


 
dms_main ©   (2004-10-29 10:23) [11]

ну насчет дебага : при креате создается файл (свой для каждого трэда),при execute он заполняется. Итог файл создан но незаполнен.


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

код Execute показывай


 
Reindeer Moss Eater ©   (2004-10-29 10:25) [13]

Итог файл создан но незаполнен.

Создается один файл, а execute пишет в другой.


 
Reindeer Moss Eater ©   (2004-10-29 10:26) [14]

хотя в console Application все работало замечательно.

Глобальные переменные тому виной.
Как пить дать.
Имя файла например.


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

имя файла предается трэду через параметр в креате.
в каждом трэде - уникальное


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

Код давай уже, да?


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

имя файла предается трэду через параметр в креате.

Что-то я не вижу, что передается.
Читая твой первый постинг.


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


var
List:textfile;
       assignfile(list,drive+".txt");
       rewrite(list);
       FindFile(drive+":\round.txt");
       closefile(list);
       checkList:=TStringList.Create;
       checklist.Duplicates:=dupIgnore;
       checklist.Sorted:=true;
       checkList.LoadFromFile(drive+".txt");
       checklist.SaveToFile(drive+".txt");
       checklist.Clear;
       parseFile(drive+".txt");
  end;
   mycountsection:=TcriticalSection.Create;
   mycountsection.Enter;
   try
   threadcount:=threadcount-1;
   finally
   mycountsection.Leave;
   mycountsection.Free;
   end;


 
dms_main ©   (2004-10-29 10:34) [19]


constructor tmythread.create(drive:char);
begin
  inherited create(false);
end;


было б в нем дело......


 
Reindeer Moss Eater ©   (2004-10-29 10:37) [20]

Это что? код Execute?

И нафик тогда там критическая секция которая создается при входе и уничтожается при выходе?
Кого она синхронизирует?

Что такое Drive? Поле класса или переменная модуля?

В общем бред какой-то.

И где все же передается имя файла?


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


> Что такое Drive? Поле класса или переменная модуля?

Drive : char - смотри след. пост

> И нафик тогда там критическая секция которая создается при
> входе и уничтожается при выходе?
> Кого она синхронизирует?

пременная threadcount:integer - счетчик трэдов...
и вообще мы от темы ушли - дело не в том что выскакивает ошибка - дело в том что execute метод не вызывается вообще.....


 
Reindeer Moss Eater ©   (2004-10-29 10:42) [22]

Drive : char - смотри след. пост

Да пофик чар она или стринг!
Переменная это или член класса потока?!


 
dms_main ©   (2004-10-29 10:43) [23]


> Да пофик чар она или стринг!
> Переменная это или член класса потока?!

член класса потока - естественно...


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

В общем так.
Твоя критическая секция - полный бред.

А что бы убедиться, что Execute все же вызывается, вставь первой строкой в него:

with TFileStream.Create(Format("%d-log.txt",[GetCurrentThreadID]),fmCreate) do
try
 WriteBuffer("А все таки она вертиться",24);
finally
  Free;
end;


 
Reindeer Moss Eater ©   (2004-10-29 10:49) [25]

constructor tmythread.create(drive:char);
begin
 inherited create(false);
end;

было б в нем дело......


И где сохранение параметра в классе?


 
Reindeer Moss Eater ©   (2004-10-29 10:50) [26]

Обсуждается какой-то мифический несуществующий код.
На кофейной гуще и то эффективнее гадать получается.


 
dms_main ©   (2004-10-29 10:52) [27]


> В общем так.
> Твоя критическая секция - полный бред.

это для тебя бред
я туда messagebox и MessageBeep($FFFFFFFF) вставлял пофиг...
дело не в том бред или нет -  там все проверено....
дело в том что метод create вызывается, а execute нет....
вот где загвоздка....


 
dms_main ©   (2004-10-29 10:53) [28]

млин ща весь выложу...


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

это для тебя бред

Это бред не только для меня.

а execute нет....

Читай [24] и не свисти MessageBeep"ом


 
Reindeer Moss Eater ©   (2004-10-29 10:55) [30]

млин ща весь выложу...

Уже не надо.


 
dms_main ©   (2004-10-29 10:55) [31]


TMyThread = class(TTHread)
 drive:char;
 list:textfile;
 checkList,sum:TStringList;
 mysection:TcriticalSection;
 mycountsection:TcriticalSection;
 constructor create(adrive:char);
 destructor free;
 procedure execute;override;
 procedure FindFile(path:string);
 procedure parseFile(name:string);

end;
constructor tmythread.create(adrive:char);
var
p:pointer;
begin
   inherited create(false);
   assignfile(list,adrive+".txt");
   rewrite(list);
   drive:=adrive;
   FreeOnTerminate:=true;
   Priority:=tpNormal;
   mycountsection:=TcriticalSection.Create;
   mycountsection.Enter;
   try
   threadcount:=threadcount+1;
   finally
   end;
   mycountsection.Leave;
   mycountsection.Free;

end;

destructor tmythread.free;
begin
   inherited free;
end;

procedure TMythread.execute;
begin
      assignfile(list,drive+".txt");
      rewrite(list);
      FindFile(drive+":\round.txt");
      closefile(list);
      checkList:=TStringList.Create;
      checklist.Duplicates:=dupIgnore;
      checklist.Sorted:=true;
      checkList.LoadFromFile(drive+".txt");
      checklist.SaveToFile(drive+".txt");
      checklist.Clear;
      parseFile(drive+".txt");
 end;
  mycountsection:=TcriticalSection.Create;
  mycountsection.Enter;
  try
  threadcount:=threadcount-1;
  finally
  mycountsection.Leave;
  mycountsection.Free;
  end;
end;



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

Все твои критические секции только пожирают ресурсы и никого нахрен не синхронизируют.
Они - бред сивой кобылы.

А про вызов Execute читай в 24 посте.


 
dms_main ©   (2004-10-29 11:04) [33]

1:

> А что бы убедиться, что Execute все же вызывается, вставь
> первой строкой в него:
>
> with TFileStream.Create(Format("%d-log.txt",[GetCurrentThreadID]),fmCreate)
> do
> try
>  WriteBuffer("А все таки она вертиться",24);
> finally
>   Free;
> end;

нифига непишется
2:
в taskmanager есчетчик трэдов - их там в проге нужное кол-во
так execute и не вызвался......  :-((


 
Reindeer Moss Eater ©   (2004-10-29 11:06) [34]

Вставил не первой строкой, либо конструктор не вызван.

Аналогичный код в конструктор.


 
Reindeer Moss Eater ©   (2004-10-29 11:07) [35]

Либо процесс вообще не имет прав на томе на создание файлов


 
Digitman ©   (2004-10-29 11:08) [36]

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


 
sniknik ©   (2004-10-29 11:08) [37]

> Обсуждается какой-то мифический несуществующий код.
> На кофейной гуще и то эффективнее гадать получается.
не расстраивайся, все просто, учись отвечать. ;о)

2 dms_main
у тебя ошибка в 17-й (семнадцатой) строке! че ты сюда 18-е (восемнадцатые) лепиш?

> я туда messagebox и MessageBeep($FFFFFFFF) вставлял пофиг...
VCL-ные или системные?

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


 
Reindeer Moss Eater ©   (2004-10-29 11:09) [38]

не расстраивайся, все просто, учись отвечать. ;о)

Я и других еще научу.


 
dms_main ©   (2004-10-29 11:10) [39]


> Вставил не первой строкой, либо конструктор не вызван.
>
> Аналогичный код в конструктор.

работает

> Либо процесс вообще не имет прав на томе на создание файлов

почему тогда это код в апликухе работает?
Апликуха которая грузит dll имеет права на создание файлов....


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

почему тогда это код в апликухе работает?

Потому что там работает другой код



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

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

Наверх




Память: 0.56 MB
Время: 0.037 c
1-1098869384
Pavlik_Morozov
2004-10-27 13:29
2004.11.14
Пролема с преобразованием типов...


1-1099316514
denis24
2004-11-01 16:41
2004.11.14
Цвет Popupmenu


1-1099385278
Dmitrij_K
2004-11-02 11:47
2004.11.14
Вопрос по параметрам процедур


1-1098994543
Луарвик
2004-10-29 00:15
2004.11.14
Как юзать memo1.ScrollBy?


1-1098873200
Phoenix
2004-10-27 14:33
2004.11.14
Проблема при сбросе данный в Exel