Главная страница
    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]


> Куда убегал то?

завтра на работу, а седня выходной, прикинь...


 
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.074 c
2-1332061177
rey4eg
2012-03-18 12:59
2013.03.22
Помогите Срочно Пожалуйста


15-1346257406
Разведка
2012-08-29 20:23
2013.03.22
Проблема нехватки памяти


2-1331808385
Login2
2012-03-15 14:46
2013.03.22
Графический интерфейс


15-1346704137
Rouse_
2012-09-04 00:28
2013.03.22
Ну собственно хвалюсь :)


4-1264071675
Омлет
2010-01-21 14:01
2013.03.22
Восстановить путь ключа реестра по HKEY





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