Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.072 c
2-1341842887
Den
2012-07-09 18:08
2013.03.22
remote desktop sreenshot?


15-1328797365
Empleado
2012-02-09 18:22
2013.03.22
Billiards masters


15-1327133819
Inovet
2012-01-21 12:16
2013.03.22
DrWeb 7.0 постоянное обращение к диску


15-1351157222
Empleado
2012-10-25 13:27
2013.03.22
DB с четырьмя таблицами


15-1337173516
oldman
2012-05-16 17:05
2013.03.22
ХОЧУ В ОТПУСК!!!





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