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

Вниз

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

 
SamProf ©   (2006-02-28 16:05) [0]

Здравствуйте, Мастера! Вопрос долгий и нудный, но мне нужно в нём разобраться! вопрос пишу в клубе, поэтому кое-где буду сокращать(...)
Есть
TmyStrGrid=class(Tstringgrid)
mycl:TmyClass;
procedure drawcell(.....)
procedure dbclick(....);
end;

Tmyclass=class
data:TList;
th:TMyThread;
constructor cretate;
destructor free;
procedure run;
procedure obrabotka;
end;

TMyThread=class(TThread)
procedure execute;
end;

Методы описаны примерно так:

procedure Tmystrtinggrid.drawcell;
begin
{берём дванные из mycl.data и чёто рискем}
end;

procedure Tmystringgrid.dbclick;
begin
mycl.run;
end;

procedure TMyclass.run;
begin
th:=TmyThread.create;
end;

procedure TMyclass.obrabotka;
begin
{обработка данных в mycl.data - длительная}
end;

procedure  tmythread.execute;
begin
mycl.obrabotka;
ebd;

ну вроде кода немного написал, а теперь рускими словами.
Есть некотрый stringgrid, у него есть свой mycl: tmyclass - из него он черпает свои данные для прорисовки, а именно из mycl.data. При двойном щелчке на гриде эти данные должны быть изменены - этот процесс может занять длительное время, мало того возможно его придётся прервать не дожидаясь окончания. Этот поток должен запустить процедуру в классе TmyClass(obrabotka).
Теперь получается:
Грид вызывает метод внутреннего класса, чтобы он создал поток на обработку данных. Естественно, что во время этого данные эти читать нельзя, но грид должен жить своей жизнью - просто рисовать другие данные - к примеру анимацию. Этот поток ваполняет в своём коде метод TMyClass, а потом какимто действием должен по окончании работы должен сказать гриду что он закончил и заставить Грид перерисоваться.
Мало, того если грид захочет, то он может этот поток завершить и запустить новый. Вот такая вот загагулина! Если кто-то понял, что я хотел выразить, то помогите пожайлуста!


 
clickmaker ©   (2006-02-28 16:28) [1]

procedure  tmythread.execute;
begin
mycl.obrabotka;
PostMessage(grid.Handle, WM_UPDATEGRID, 0, 0);
end;
WM_UPDATEGRID = WM_USER + 100 например

грид, поскольку он WinControl, может ловить сообщения
procedure OnWMUpdate(var Message: TMessage): message WM_UPDATEGRID;

можно и прямо вызвать Grid.Update, но желательно через Synchronize


 
SamProf ©   (2006-02-28 16:38) [2]

а как вызвать эго из функции Obrabotka и как в ней делать Synchronize? ведь этот метод не потока, а работает в другом потоке!

> грид, поскольку он WinControl, может ловить сообщения

А мона както без месаг? или тока с ними?


 
clickmaker ©   (2006-02-28 16:45) [3]

вот пример из дельфового хелпа, кстати

procedure TMyThread.PushTheButton;
begin
 Button1.Click();
end;

procedure TMyThread.Execute;
begin
...
 Synchronize(PushTheButton);
...
end;


 
SamProf ©   (2006-02-28 16:50) [4]


> а как вызвать эго из функции Obrabotka и как в ней делать
> Synchronize? ведь этот метод не потока, а работает в другом
> потоке!

НЕ В TMyThread.execute, А  В TMYCLASS.OBRABOTKA!!!!

procedure TMyThread.Execute;
begin
...
mycl.obrabotka
end;

procedure tmyclass.obrabotka;
begin
действия тут и synhronize нуна вызвать отсюда(вывести данные в memo....)
end;


 
Сергей М. ©   (2006-03-01 08:58) [5]


> SamProf ©   (28.02.06 16:50) [4]


> synhronize нуна вызвать отсюда


Не получится.

Synchronize() - защищенный метод, а TMyClass у тебя не есть наследник TThread



Страницы: 1 вся ветка

Текущий архив: 2006.03.19;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.048 c
2-1141233776
49 Cent
2006-03-01 20:22
2006.03.19
Можно ли подсвечивать строку в Dbgrid?


4-1135401612
***___***
2005-12-24 08:20
2006.03.19
ENUM_CURRENT_SETTINGS


2-1141608415
tolians
2006-03-06 04:26
2006.03.19
Помогите сделать SQL запрос


2-1141196548
JEK2
2006-03-01 10:02
2006.03.19
Как програмно изменить размер канвы TImage


15-1140614702
ArtemESC
2006-02-22 16:25
2006.03.19
Редактор физических секторов диска...