Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
1-1139251826
Kolan
2006-02-06 21:50
2006.03.19
Как усыпить поток.


2-1141582040
ctudent
2006-03-05 21:07
2006.03.19
Проблем-с! Возник?


15-1140508399
Nikolay M.
2006-02-21 10:53
2006.03.19
Увидел на mysql.ru, предлагаю повесить на страничках


15-1140639598
Ломброзо
2006-02-22 23:19
2006.03.19
DMJS 1.0


2-1141047541
zx_
2006-02-27 16:39
2006.03.19
CD диск





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский