Текущий архив: 2003.09.11;
Скачать: CL | DM;
Вниз
а что рекурсия в потоке не работает ? Найти похожие ветки
← →
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;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.011 c