Форум: "Прочее";
Текущий архив: 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]
> Куда убегал то?
завтра на работу, а седня выходной, прикинь...
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.081 c