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

Вниз

а что рекурсия в потоке не работает ?   Найти похожие ветки 

 
lord   (2003-08-30 22:36) [0]

привет всем
а что рекурсия в потоке не работает ?

procedure my(s:string);
begin
...
...
...
my("proba");
end;
процедура запущена в отдельном потоке
и после енного количества проходов выдает ошибку
что по данному адресу выполнить операцию не удалось


 
Ihor Osov'yak   (2003-08-30 23:13) [1]

Рекурсии, вообще говоря, как-бы все равно в каком потоке выполнятся.. Причина в чем то другом. Например, по "дикому" указателю в стеке портишь адресс возврата из подпрограммы, как следствие при выходе их процедуры происходит переход по невесть какому адресу по которому находится невесть что..
.. Мугут быть и другие причины, более или менее экзотические. Но "рекурсия в потоке не работает" - это абсолютно лишенное смысла словосочетание..


 
DrPass   (2003-08-30 23:13) [2]

Наверняка работает. Просто от такой милой рекурсии стек рано или поздно заканчивается


 
Ihor Osov'yak   (2003-08-30 23:18) [3]

2 [2] DrPass © (30.08.03 23:13)

Если быть уж очень придирчивым, то на месте

...
...
...

вполне могло быть что-то типа

if Что-то then exit;

.. а могло и не быть :-)


 
Anatoly Podgoretsky   (2003-08-30 23:20) [4]

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


 
lord   (2003-08-30 23:27) [5]

TO анатолий
естественно ето упрощенный пример
насамом деле там стоит ваша проседура
сканирование каталогов тока без занисения в листбокс


 
Anatoly Podgoretsky   (2003-08-30 23:29) [6]

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


 
lord   (2003-08-30 23:36) [7]

если запустить ее не в потоке то работает на ура

ето полный код процедуры .

procedure ScanDir(StartDir: string; Mask:string);
var
SearchRec : TSearchRec;
begin
if Mask = "" then Mask := "*.*";
if StartDir[Length(StartDir)] <> "\" then StartDir := StartDir + "\";
if FindFirst(StartDir+Mask, faAnyFile, SearchRec) = 0 then
begin repeat Application.ProcessMessages;
if (SearchRec.Attr and faDirectory) <> faDirectory then
// List.Add(StartDir + SearchRec.Name)
else
if (SearchRec.Name <> "..") and (SearchRec.Name <> ".") then
begin
// List.Add(StartDir + SearchRec.Name + "\");
ScanDir(StartDir + SearchRec.Name + "\",Mask);
end;
until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
end;


 
Anatoly Podgoretsky   (2003-08-30 23:55) [8]

А вот это вредное для потока Application.ProcessMessages, попробуй бех него.


 
Ihor Osov'yak   (2003-08-30 23:57) [9]

2 [7] lord © (30.08.03 23:36)

Блин, ну Вы даете...

Application.ProcessMessages в рабочем потоке.. Я чуть не поперхнулся.. Нельзя так жестоко..

Книги чтитать.. Быстро!!!! В смысле не читать быстро, это нужно вдумчиво.. А быстро к книгам...


 
lord   (2003-08-31 00:02) [10]

прошу прощения что народ перепугал
нет там Application.ProcessMessages
я его просту стереть забыл когда
сюда код выкладывал


 
Anatoly Podgoretsky   (2003-08-31 00:18) [11]

Тогда плохого вроде не вижу, жди других специалистов, может подскажут.


 
Islander   (2003-08-31 00:18) [12]

Посоветую вот что (т.к. сам много работаю со всякими сканерами папок)

1) попробуйте передавать параметры через var

2) поппробуйте вообще снести mask

А как вы поток с этой процедурой создаете, код можно глянуть?


 
Ihor Osov'yak   (2003-08-31 00:25) [13]

2 [12] Islander (31.08.03 00:18)

пп. 1 и 2 к проблеме отношения не имеет..
а вот "А как вы поток с этой процедурой создаете, код можно глянуть?" плюс код вызова процедуры и условие окончания потока посмотреть желательно..

Зы - а после убирания Application.ProcessMessages с первого взгляда претензий к коду нет. Ну разве что смутные подозрения вызывают закоментированные List.Add (а вдруг, не все закоментировано, и что это за зверь List для случая, если не все закоментировано...)


 
lord   (2003-08-31 00:55) [14]

поток создан помошником дельфи
с именем класса Tmythrd
а запускаю так :

procedure TForm1.Button4Click(Sender: TObject);
begin
tmythrd.Create(false);
end;
------------------------------------------------
procedure TForm1.Button4Click(Sender: TObject);
var
mythrd:tmythrd;
begin
mythrd:=tmythrd.Create(false);
end;

в обоих случаях ошибка одна и таже


 
Ihor Osov'yak   (2003-08-31 01:13) [15]

Метод Execute приведи.. И как вызов ScanDir делаешь..


 
Asteroid   (2003-08-31 02:45) [16]

В хелпе советовали использовать не TList, а TThreadList. А с закомментированными List.Add процедура вообще ничего полезного не делает.


 
lord   (2003-08-31 12:23) [17]

вызов в Execute выглядит так :
ScanDir("c:\","*.*");

а List.add заремирована временно чтоб
не путатся с Synchronize


 
sniknik   (2003-08-31 13:51) [18]

могу обрадовать, работает.
значит (если у меня работает и у других подозреваю тоже) то у вас ошибка в коде, причем в том месте которое здесь не приведено (а значит сам разбирайся).
попутно небольшой глюк в приведенном ScanDir если его вызывать с параметрами маски несуществующем в первом каталоге файлов то вывалится сразу, в общем правильно работать будет только с маской "*.*", и если ты в потоке пытаешся задавать отличную от этой маску то ... ничего не найдеш. но говориш не в этом дело, ошибка после некоторого количества циклов (тоже не приведена, а значит сам разбирайся)


 
Anatoly Podgoretsky   (2003-08-31 14:54) [19]

Для начала поступи по другому, выкить этот текст (сохрани конечно) и напиши по новому, после этого попробуй, вероятно заработает. Поскольку приведенный тобоой текст, это не тот текст который у тебя.

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


 
Galera   (2003-08-31 15:32) [20]

Вопрос: а зачем нужен отдельный поток,
и потом логика процедуры мне понятна, но по крайней мере для меня выглядит немного странно (lord © (30.08.03 23:36) [7] )
Что конкретно должна сделать процедура?
// List.Add(StartDir + SearchRec.Name)
просто добавить в LIST?



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.09.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.007 c
3-33481
pasha_golub
2003-08-20 14:18
2003.09.11
Добавление TDBGrid.OnDrawColumnCell


1-33590
dez
2003-08-28 12:42
2003.09.11
TdxEdit и др.


6-33710
Maxim Pshevlotsky
2003-07-08 15:59
2003.09.11
Как узнать скорость передачи данных на FTP сервер????


7-33822
Shitikov
2003-06-27 07:45
2003.09.11
COM порт


1-33629
muravey
2003-08-31 14:41
2003.09.11
TCombobox





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