Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Зависает при потоке   Найти похожие ветки 

 
М   (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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.049 c
2-1339150256
Besenok
2012-06-08 14:10
2013.03.22
Использование dbghelp.dll


15-1344630602
Юрий
2012-08-11 00:30
2013.03.22
С днем рождения ! 11 августа 2012 суббота


2-1337145645
Verner
2012-05-16 09:20
2013.03.22
Переопределение свойства класса-наследника


15-1336640074
jacksotnik
2012-05-10 12:54
2013.03.22
Можно ли в DesignMode открыть закрыть модуль зная его имя?


15-1352799802
Handler
2012-11-13 13:43
2013.03.22
названия пунктов меню