Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизЗависает при потоке Найти похожие ветки
← →
М (2012-06-02 15:19) [0]Это продолжение моего вопроса про поиск файла:
delphimaster.net/view/15-1338481548/
type
TMyThread = class(TThread)
protected
procedure Execute; override;
end;
{ TMyThread }
procedure TMyThread.Execute;
begin
//Sleep(50);
Synchronize(Form1.ScanProc);
end;
var
FMyThread: TMyThread;
procedure TForm1.ScanProc;
var
Info : TSearchRec;
FileName: string;
begin
Memo1.Clear;
If ScanFile(Label1.Caption, Edit1.Text, FileName, Info) then
begin
Memo1.Lines.Add("Имя : " + FileName);
Memo1.Lines.Add("Атрибуты: " + GetAttributes(Info.Attr));
Memo1.Lines.Add("Размер : " + IntToStr(Info.Size) + " байт(а)");
Memo1.Lines.Add("Создан : " + GetDate(Info.Time) + ", " + GetTime(Info.Time));
end else
Memo1.Lines.Add("Unknown.");
end;
procedure TForm1.WMScan(var Msg: TMessage);
begin
ScanProc;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FMyThread.Resume;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Label1.Caption:= GetDirectory("Choose directory...");
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FMyThread := TMyThread.Create(True);
FMyThread.Priority:= tpNormal;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FMyThread.Free;
end;
Нажимаю Button1, т.е. запускаю поток.
Приложение виснет во время поиска, потом его "отпускает".
Почему виснет, ведь все по примеру сделано?
← →
М (2012-06-02 16:11) [1]Подскажите кто-нибудь!
У меня сроки горят!
← →
Loginov Dmitry © (2012-06-02 16:39) [2]
> procedure TMyThread.Execute;
> begin
> //Sleep(50);
> Synchronize(Form1.ScanProc);
> end;
Вызов Synchronize приводит к тому, что метод ScanProc будет выполнен в контексте основного потока.
Вы делаете полнейший бред: из основного потока создаете дополнительный поток лишь для того, чтобы произвести вызов метода ScanProc в контексте основного потока.
> Почему виснет, ведь все по примеру сделано?
Что за пример? Показывайте!
← →
Ega23 © (2012-06-02 23:57) [3]
> procedure TMyThread.Execute;
> begin
> //Sleep(50);
> Synchronize(Form1.ScanProc);
> end;
Читай справку по синхронайз. И не читай Архангельского.
← →
Rouse_ © (2012-06-03 00:07) [4]Наоборот, читай Архангельского, он правильные вещи говорит, в том числе приводит и данный код, как постоянную ошибку программистов.
Перечитай ту главу, по которой ты писал данный код и подумай еще раз...
← →
Anatoly Podgoretsky © (2012-06-03 09:46) [5]> Rouse_ (03.06.2012 00:07:04) [4]
Настолько хорошо написал, что по этому коду и делают
← →
М (2012-06-03 12:38) [6]http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1370
← →
sniknik © (2012-06-03 12:56) [7]не только Архангельского не читают, но бездумно правят данные в них примеры.
в ссылке все правильно написано, пример верный, для того что написано, и тем не менее вывод с переписыванием кривой.
М (03.06.12 12:38) [6]
почитай еще раз, зачем и ЧТО там переносят в синхронайз.
← →
М (2012-06-03 15:03) [8]Переводят синхронизацию я GUI.
Это получается ScanProc нужно сделать методом TMyThread?
← →
М (2012-06-03 15:14) [9]Как правильно делать надо?
Сроки горят.
← →
brother © (2012-06-03 15:26) [10]> Сроки горят.
проблеммы индейцев шерифа не волнуют...
← →
sniknik © (2012-06-03 15:34) [11]> Это получается ScanProc нужно сделать методом TMyThread?
не знаю про что ты тут, но в статье синхронизация для отображения результатов в VCL. а не самой работы.
> Как правильно делать надо?
как делать, методом или по другому это на усмотрения программиста.
правильно, это когда все работает как задумывалось. а реализации правильности могут быть различны.
← →
М (2012-06-03 15:55) [12]
> Loginov Dmitry © (02.06.12 16:39) [2]
>
>
> > procedure TMyThread.Execute;
> > begin
> > //Sleep(50);
> > Synchronize(Form1.ScanProc);
> > end;
>
>
> Вызов Synchronize приводит к тому, что метод ScanProc будет
> выполнен в контексте основного потока.
>
> Вы делаете полнейший бред: из основного потока создаете
> дополнительный поток лишь для того, чтобы произвести вызов
> метода ScanProc в контексте основного потока.
>
Тогда метод ScanProc кому должен принадлежать?
Как его правильно вызвать?
← →
картман © (2012-06-03 16:18) [13]TMyThread = class(TThread)
private
procedure ScanProc;
procedure OutputResult;
protected
procedure Execute; override;
end;
procedure TMyThread.ScanProc;
begin
...
если нужно, вызывать Synchronize(OutputResult); здесь
end;
procedure TMyThread.Execute;
begin
//Sleep(50);
ScanProc;
Synchronize(OutputResult);
end;
procedure TMyThread.OutputResult;
begin
Form1.Label1.Caption := "усё, на";
end;
← →
М (2012-06-03 16:41) [14]
> картман
Спасибо.
Есть еще один момент.
По Button1 включается/выключается процесс поиска.
Пока ищется - все нормально.
Когда в Memo1 показываются результаты поиска, при
нажатии на кнопку все валится rammstein.ttf с ошибкой "Thread error 5. Отказано в доступе".
В чём ошибка?
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Tag:= Button1.Tag xor 1;
case Button1.Tag of
0:
begin
Button1.Caption:= "Scan";
FMyThread.Suspend;
end;
1:
begin
Button1.Caption:= "Stop";
FMyThread.Resume;
end;
end;
end;
← →
robt (2012-06-03 16:56) [15]
> Сроки горят.
да уж лучше они сгорят, чем кто то заплатит за такое говнище хз из чего собранное
← →
М (2012-06-03 16:58) [16]
> robt (03.06.12 16:56) [15]
Мне в институт надо.
> говнище
Почему это?
Это "говнище" состоит полностью из ваших советов, мастера! :D
← →
robt (2012-06-03 17:06) [17]
> состоит полностью из ваших советов
тебе такого никто тут не советовал, это ты сам "читаю книгу-вижу фигу"
← →
М (2012-06-03 17:11) [18]
> robt (03.06.12 17:06) [17]
Ты уверен?
← →
robt (2012-06-03 17:12) [19]палюбому
← →
М (2012-06-03 17:13) [20]Где именно "говнище"?
Сколько тебе лет?
← →
robt (2012-06-03 17:20) [21]в [2] описано
больше 15
← →
М (2012-06-03 17:30) [22]
> robt (03.06.12 17:20) [21]
Ты читал это [14]?
← →
robt (2012-06-03 17:52) [23]читал ичо?
← →
robt (2012-06-03 18:03) [24]если ты про то почему ошибка,то потому что, нельзя остановить поиск файлов,особенно рекурсивный,а потом продолжить без последствий
либо начинать заново, либо менять алгоритм на нерекурсивный с отложенной остановкой только после полного проскана текущей папки
← →
М (2012-06-03 18:31) [25]С поискам файлов все отлично.
Я про [14]
Там где нужно включать и выключать поиск.
Ошибка происходит при Resume/Suspend.
1 раз ищем - нормально.
Нажимаем на кнопку, чтобы остановить (выключить поток, т.к. мы уже нашли и нам нужно 2-й раз ввести новую маску для поиска)
Поэтому мы выключаем.
Вводим новое (или оставляем старое)
Нажимаем на кнопку и происходит ошибка.
При Suspend.
В чем дело?
← →
robt (2012-06-03 18:37) [26]
> В чем дело?
я собственно про это и написал
← →
sniknik © (2012-06-03 18:41) [27]> Это "говнище" состоит полностью из ваших советов, мастера! :D
из твоих интерпретаций. никто не говорит "нужно именно так", всегда "можно примерно так".
> Поэтому мы выключаем.
то что показано выключить нельзя, нет проверки на терминатед. приостановка, это не выключение.
> В чем дело?
в 17 строке.
← →
М (2012-06-03 18:43) [28]Не в поиска файла дело.
Даже если из Execute все убрать валится когда
сперва делаем Resume, потом Suspend. Вот на этом Suspend говорит
отказано в доступе ошибка 5.
← →
М (2012-06-03 18:49) [29]
> sniknik © (03.06.12 18:41) [27]
Запускаю поток через Resume.
Suspend его не вырубает получается? А только приостанавливает?
Тогда выключить надо через Terminate?
С потоками работаю 2-й день.
← →
robt (2012-06-03 18:56) [30]
> С потоками работаю 2-й день.
без разницы
http://translate.google.ru/?hl=ru&tab=wT#en|ru|Suspend
← →
М (2012-06-03 19:02) [31]
// Запускаем поток, в котором есть поиск. (Не важно)
procedure RunScan;
begin
FMyThread.Resume;
end;
// Вырубаем поток. (Не останавливаем), в котором есть поиск. (Не важно)
procedure StopScan;
begin
FMyThread.Terminate;
end;
1 раз это срабатывает.
2 раз - нет. Почему?
← →
М (2012-06-03 19:03) [32]
> robt (03.06.12 18:56) [30]
Это понятно.
← →
М (2012-06-03 19:09) [33]Или выключить потом, а потом включить можно только через Create/Free?
← →
robt (2012-06-03 19:25) [34]
> М (03.06.12 19:09) [33]
ну слово "только" тут не уместно, но для начинающих лучше именно так
← →
sniknik © (2012-06-03 19:28) [35]нет, можно и через Suspend/Resume, НО!!! для этого его надо так написать, с циклом внутри, проверками, так чтобы в любой момент с любого места... и т.д.
← →
М (2012-06-03 19:40) [36]
> sniknik © (03.06.12 19:28) [35]
В смысле.
> robt (03.06.12 19:25) [34]
>
>
> > М (03.06.12 19:09) [33]
>
> ну слово "только" тут не уместно, но для начинающих лучше
> именно так
Как по-другому?
← →
М (2012-06-03 20:05) [37]Вы куда убежали все?
← →
sniknik © (2012-06-03 21:28) [38]>> sniknik © (03.06.12 19:28) [35]
> В смысле.
42
> М (03.06.12 20:05) [37]
в смысле.
← →
М (2012-06-03 21:42) [39]
> sniknik © (03.06.12 21:28) [38]
>
> >> sniknik © (03.06.12 19:28) [35]
> > В смысле.
> 42
Тебе
> в смысле.
Куда убегал то?
← →
robt (2012-06-03 21:47) [40]
> Куда убегал то?
завтра на работу, а седня выходной, прикинь...
← →
sniknik © (2012-06-03 22:27) [41]http://lurkmore.to/42
← →
М (2012-06-04 09:10) [42]
> robt (03.06.12 21:47) [40]
>
>
> > Куда убегал то?
>
> завтра на работу, а седня выходной, прикинь...
Вы ж тут целыми сутками торчите.
> sniknik © (03.06.12 22:27) [41]
Это вопрос по-твоему вселенской важности?
Возвращаемся к потоку, как его правильно останавливать?
← →
sniknik © (2012-06-04 09:28) [43]> Это вопрос по-твоему вселенской важности?
из ссылки
«42» стали использовать в качестве универсального ответа на пространные или туманные вопросы...
и еще, заранее
«42» стало мемом задолго до того, как эти ваши интернеты стали доступны широким слоям населения.
> Возвращаемся к потоку, как его правильно останавливать?
разве не ответили? как напишешь, т.е. полностью зависит от реализованной тобой логики. нам то ее откуда знать?
а проще всего как в примере, по ссылке в которой ты не читал - отработал целиком и "помер" сам.
но проще не значит правильно (не всегда) в конкретном случае. (и чё все ламеры на этом зациклятся? только и выясняют "как правильно", вместо "как можно")
← →
М (2012-06-04 09:49) [44]
> sniknik © (04.06.12 09:28) [43]
Мой вопрос для тебя туманен?
В комнате накурено? :)
> нам то ее откуда знать?
Бр. Тебе сложно понять?
Есть кнопка включить/выключить некий процесс с вычислениями.
Сам процесс в потоке. Сложно? Ну тогда можешь в эту ветку больше не заглядывать, мастер.
> вместо "как можно"
У потока мало методов, там можно делать всегда по-разному? :D
> и чё все ламеры на этом зациклятся?
Жирнота.
> по ссылке в которой ты не читал
Тебе виднее чо.
← →
AV © (2012-06-04 10:17) [45]http://podgoretsky.com/ftp/Docs/Delphi/DX/Martin%20Harvey%20-%20Threads.pdf
← →
Ega23 © (2012-06-04 10:32) [46]тОлсто.
← →
М (2012-06-04 10:40) [47]
> Ega23 © (04.06.12 10:32) [46]
>
> тОлсто.
А я о чем.
← →
Ega23 © (2012-06-04 10:53) [48]
> А я о чем.
Я - о тебе. А ты о чём?
← →
Inovet © (2012-06-04 11:49) [49]> [44] М (04.06.12 09:49)
> Есть кнопка включить/выключить некий процесс с вычислениями.
Есть кнопка на блоке питания (вилка с розеткой тоже годятся) - включить выключить компьютер. Ты ей компьютер выключаешь для завершения процесса работы с ним?
← →
Inovet © (2012-06-04 11:50) [50]> [44] М (04.06.12 09:49)
> У потока мало методов, там можно делать всегда по-разному?:D
Методы, блин. А вголове при этом пусто. Ещё вякаешь тут.
← →
robt (2012-06-04 12:00) [51]
> Вы ж тут целыми сутками торчите.
это ты кого задротом назвал ?
← →
sniknik © (2012-06-04 12:58) [52]> Мой вопрос для тебя туманен?
а то. объясни в контексте что он значит
вопрос
>>> Или выключить потом, а потом включить можно только через Create/Free?
ответ
>> нет, можно и через Suspend/Resume, НО!!! для этого его надо так написать, с циклом внутри, проверками, так чтобы в любой момент с любого места... и т.д.
вопрос
> В смысле.
???? что здесь значит в смысле? 42? точно 42.
← →
М (2012-06-04 15:28) [53]Удалено модератором
← →
Ega23 © (2012-06-04 15:31) [54]
> Пример где?
> " с циклом внутри, проверками, так чтобы в любой момент
> с любого места..."
Так эта... Поезд ушол, 3 желания кончились. А на новые ты пока не наработал.
← →
Inovet © (2012-06-04 15:35) [55]Я замечаю в последнее время новый термин среди юзеров включить/выключить. Например, включил Ворд (запустил Ворд), включил Интернет (запустил браузер), включил Ютьюб (перешёл на закладку с Ютьюб в браузере).
Теперь вот и "программисты" туда же.
← →
sniknik © (2012-06-04 15:49) [56]> Пример где?
вот из-за такого хамско-потребительского отношения его и не будет.
← →
Декаборь (2012-06-04 16:00) [57]> Inovet © (04.06.12 15:35) [55]
> включил Интернет
А как правильно? Войти, аки в дом, али выйти, аки в поле?
← →
картман © (2012-06-04 16:07) [58]
> Inovet © (04.06.12 15:35) [55]
> включил Интернет
главное, чтоб не выключил
← →
М (2012-06-04 16:10) [59]Удалено модератором
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.59 MB
Время: 0.068 c