![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 22.08.2007
Сообщений: 59
|
![]()
Доброго времени суток!
У меня есть фун-ция, которая выполняет поиск файлов и добавляет найденные в StringGrid. Если маска для поиска, например, C:\ или D:\ то фун-ция будет отрабатывать довольно долго. Хочу сделать так, чтобы во время работы фун-ции появлялась форма, на которой был бы Animate.Active = true и после завершения функции форма закрывалась и появлялся уже заполненный StringGrid. Пытаюсь сделать выполнение моей фун-ции в потоке, то есть когда появляется форма с Animate и Animate.Active = true, фун-ции выполняется в потоке. Проблема в том, что я практически не знаком с потоками и пока не могу разобраться. Подскажите пожалуйста, как мне сделать выполнение функции в событии потока? И как поступить с функцией? Она написана не удачно и привязана к StringGrid, а поток ведь должен быть полностью не зависим от компонент. Заранее спасибо. |
![]() |
![]() |
![]() |
#2 | |
Форумчанин
Регистрация: 31.05.2007
Сообщений: 486
|
![]()
Вообще-то, это не маска, а указание пути поиска, хотя я может не так понял.
Цитата:
![]() Чтобы потоки нормально работали с разными элементами, значения элементов нужно менять не в методе Execute, а вызывать из Execute процедуру Synchronize и уже в ней менять разные свойства/переменные и т.д. Но скорость работы при этом падает. Если в StringGrid "лезет" только один поток, то никаких проблем не будет и без Synchronize. Проблемы начнутся только если сразу несколько потоков будут работать с таблицей. В принципе, поток может сохранять имена файлов внутри себя и заполнять StringGrid после окончания работы. |
|
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 13.12.2006
Сообщений: 3,859
|
![]()
проблемы все ранво могут начаться, так как все события StringGrid-а буду т обрабатываться VCL-потоком
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи |
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 22.08.2007
Сообщений: 59
|
![]()
То что все действия с визуальными компонентами нужно описывать в Synchronize - это я понял, спасибо. а как реализовать событие потока?
Я попытался, но не хватает практики в подобных вещах, и ничего не получается. |
![]() |
![]() |
![]() |
#5 |
Форумчанин
Регистрация: 24.10.2007
Сообщений: 254
|
![]()
Создаш проект, кинеш две кнопки, лэйбел, едит, в модуль вставишь этот код и го
Код:
|
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 22.08.2007
Сообщений: 59
|
![]()
Спасибо конечно, но это я в курсе, об этом во всех книгах пишут.
Меня интересует как конкретно работать с событиями потоков, как их объявлять и использовать. |
![]() |
![]() |
![]() |
#7 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
![]()
в public описываете процедуры типа procedure DoMy; потом их вызываете с помощью синхронизации в execute. В чем еще проблема то ? Вам подобное описали выше. Наверное Вы имеете ввиду обрабатывать события - если да то вот пример на быструю руку
Код:
|
![]() |
![]() |
![]() |
#8 |
Пользователь
Регистрация: 22.08.2007
Сообщений: 59
|
![]()
Извините что не долго не отписывался на свою же тему. Уезжал на праздники
![]() Делаю всё как вы посоветовали, но ничего не происходит. Такое впечатление, что поток не выполняется, хотя вроде должен. Делаю: potok := TSimpleThread.Create(true); potok.OnSimPath := SimPath; potok.Resume; SimPath объявлена в привате основной формы как procedure SimPath(Sender: Tobject; const str1, str2: String; fl: integer) и реализована так: procedure TMainForm.SimPath(Sender: Tobject; const FilePath, LinkPath: String; fl: integer); begin MainForm.StringGrid1.Cols[0].Add(str1); MainForm.StringGrid1.Cols[1].Add(str2); MainForm.StringGrid1.Cols[3].Add(str1); end; Подскажите пожалуйста, тут нет ошибок? |
![]() |
![]() |
![]() |
#9 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
![]()
Совершенно верно тут ошибок и не будет. Только в поток Вы не сделали следующее
type tpotok = class(TThread) private procedure dosimpath; public procedure execute; override; ... onsimpatch: ... end; ... procedure tpotok.onsimpatch; begin if assigned(onsimpatch) then onsimpatch(...); end; procedure tpotok.execute; begin ... Synchronize(DoProcess); ... end; |
![]() |
![]() |
![]() |
#10 |
Пользователь
Регистрация: 22.08.2007
Сообщений: 59
|
![]()
Это я реализовал, просто не стал писать. Похоже что проблема свелась к передаче параметров функции Func1(str1, str2: string; fl: integer), которая у меня выполняется в Execute.
По крайней мере я думаю, что проблема именно в этом. Подскажите, как правильно это реализовать. Я пытался, но ничего не получается. Func1 у меня выполняется в потоке, она ищет файлы и в зависимости от значения fl добавляет строки в StringGrid. В предыдущем сообщении я писал как я пытался это сделать, но у меня ничего не получается. Без потоков работает всё как надо, а в потоке ничего не получается. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
События для DBGrid | Максим_Леонидович | Компоненты Delphi | 1 | 08.08.2008 22:43 |
Создание события формы, доступного в Disign-time | Fausto | Компоненты Delphi | 4 | 06.06.2008 16:12 |
Распараллеливание потока | eXa | Общие вопросы Delphi | 3 | 19.07.2007 20:11 |