![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] Потоки,Файлы,Поиск. |
|
Delphi - [решено] Потоки,Файлы,Поиск.
|
Пользователь Сообщения: 75 |
Что я делаю не так?Я хочу когда включаешь поиск что бы можно было передвигать форму сворачивать итд.Но когда я скнирую Диск С на наличие файлов.Форма намертво виснет.
Вот исходник окна с кнопкой, Editом и Memo. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Memo1: TMemo; Label1: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses Unit2; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var NewThread: Thread; begin Memo1.Clear; // очистка списка файлов Form1.Label1.Caption:='Сканирую!'; NewThread:=Thread.Create(True); NewThread.Priority:=tpLower; NewThread.FreeOnTerminate:=True; NewThread.FindFile(Form1.Edit1.Text); NewThread.Resume; end; end. Вот исходник созданного файла потока: unit Unit2; interface uses Classes {$IFDEF MSWINDOWS} , Windows {$ENDIF},SysUtils; type Thread = class(TThread) private Dir : string; fff : string; procedure SetName; protected procedure Execute; override; public procedure FindFile(Dir : string); procedure Plus; end; implementation uses Unit1, Unit3; { Important: Methods and properties of objects in visual components can only be used in a method called using Synchronize, for example, Synchronize(UpdateCaption); and UpdateCaption could look like, procedure Thread.UpdateCaption; begin Form1.Caption := 'Updated in a thread'; end; } {$IFDEF MSWINDOWS} type TThreadNameInfo = record FType: LongWord; // must be 0x1000 FName: PChar; // pointer to name (in user address space) FThreadID: LongWord; // thread ID (-1 indicates caller thread) FFlags: LongWord; // reserved for future use, must be zero end; {$ENDIF} { Thread } procedure Thread.SetName; {$IFDEF MSWINDOWS} var ThreadNameInfo: TThreadNameInfo; {$ENDIF} begin {$IFDEF MSWINDOWS} ThreadNameInfo.FType := $1000; ThreadNameInfo.FName := 'NewThread'; ThreadNameInfo.FThreadID := $FFFFFFFF; ThreadNameInfo.FFlags := 0; try RaiseException( $406D1388, 0, sizeof(ThreadNameInfo) div sizeof(LongWord), @ThreadNameInfo ); except end; {$ENDIF} end; procedure Thread.Execute; begin SetName; if terminated then exit; end; procedure Thread.FindFile(Dir : String); var SR:TSearchRec; FindRes:Integer; begin FindRes:=FindFirst(Dir+'*.*',faAnyFile,SR); While FindRes=0 do begin if ((SR.Attr and faDirectory)=faDirectory) and ((SR.Name='.')or(SR.Name='..')) then begin FindRes:=FindNext(SR); Continue; end; // åñëè íàéäåí êàòàëîã, òî if ((SR.Attr and faDirectory)=faDirectory) then begin // âõîäèì â ïðîöåäóðó ïîèñêà ñ ïàðàìåòðàìè òåêóùåãî êàòàëîãà + // êàòàëîã, ÷òî ìû íàøëè FindFile(Dir+SR.Name+'\'); FindRes:=FindNext(SR); // ïîñëå îñìîòðà âëîæåííîãî êàòàëîãà ìû ïðîäîëæàåì ïîèñê // â ýòîì êàòàëîãå Continue; // ïðîäîëæèòü öèêë end; fff:=SR.Name; Synchronize(Plus); FindRes:=FindNext(SR); end; FindClose(SR); end; procedure Thread.Plus; begin Form1.Memo1.Lines.Add(fff); end; end. Что я делаю не так как нужно написать что бы не висла форма? |
|
Отправлено: 15:50, 22-09-2011 |
Пользователь Сообщения: 75
|
Профиль | Отправить PM | Цитировать Все Сам Решил!!!Спасибо!!!
|
Отправлено: 15:57, 22-09-2011 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 1
|
Профиль | Отправить PM | Цитировать надо поиск в отдельном потоке запускать и приоритет етого потока объявить ниже чем системный
|
Отправлено: 16:51, 28-10-2011 | #3 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
C/C++ - Builder 6.0 потоки | alextrs | Программирование и базы данных | 2 | 17-04-2008 21:32 | |
Проблемы: поиск и файлы панели управления | Man itu | Microsoft Windows 2000/XP | 7 | 06-03-2005 00:53 | |
Delphi - Delphi7, потоки | mahsus | Программирование и базы данных | 1 | 19-10-2004 16:46 | |
Потоки в VC++6.0 | Guest | Программирование и базы данных | 1 | 20-02-2004 05:06 | |
Файлы и потоки | netmax | Программирование и базы данных | 1 | 14-05-2003 09:37 |
|