Форум: "Начинающим";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
ВнизМорока с потоакми Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.011 c