|
|
#1
|
|||
|
|||
Морока с потоками
Вопрос долгий и нудный, но мне нужно в нём разобраться! вопрос пишу в клубе, поэтому кое-где буду сокращать(...)
Есть 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, а потом какимто действием должен по окончании работы должен сказать гриду что он закончил и заставить Грид перерисоваться. Мало, того если грид захочет, то он может этот поток завершить и запустить новый. Вот такая вот загагулина! Если кто-то понял, что я хотел выразить, то помогите пожайлуста! а как вызвать эго из функции Obrabotka и как в ней делать Synchronize? ведь этот метод не потока, а работает в другом потоке! |