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

Вниз

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

Наверх





Память: 0.55 MB
Время: 0.037 c
14-1098882421
SPeller
2004-10-27 17:07
2004.11.14
А у нас отопление дали


14-1098451206
VID
2004-10-22 17:20
2004.11.14
Генеральный поиск квартиры :)


1-1098949125
gonzales
2004-10-28 11:38
2004.11.14
WinHelp?


14-1098442543
pavel_guzhanov
2004-10-22 14:55
2004.11.14
как вывести комп из сонного состояния?


3-1097763050
denis24
2004-10-14 18:10
2004.11.14
Добавление записи в table





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