Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Threads: можно ли из одного потока запустить и остановить другой


mmb ©   (2002-08-05 11:18:00) 

Можно ли из Execute одного потока запустить или остановить другой поток, эффективно ли такое взаимодействие потоков?


ACR   (2002-08-06 12:11:00) [1]

>mmb

>то он будет сидеть перед замершим экраном. Это будет как в досе

хорошо сказал...
:-)

а даже если и в потоке канвас будешь локать всеравно получится "как в досе" :-)

зделай без потоков
примерно вот так

j = 0;
P = 10;


for(i=0;i<количество графиков;i++)
{
рисуем график(i);

j++;
if (j==P)
{
j=0; //суда мы будем попадать после каждого десятого графика... здесь вызываешь Repaint() того об"екта на котором ресуеш... еще можно(нужно?) вставит Application->ProcessMessage()
тогда можно реализовать кнопочку Cancel... чтобы все эти "репаинты" не тормозили дело то в зависимости от количество графиков можно увеличить или уменьшить P или даже дать пользователю самому настроить этот параметр... ИМХО очень хорошая методика... всебы так делали... а то бывает сидишь как в досе :-)



}



}






mmb   (2002-08-06 11:47:00) [2]

В ThrDisplay как раз на TCanvas рисуются графики (обычно не менее 100, часто гораздо больше несколько тысяч). Оператор с помощью скролинга может видеть процесс в динамике. Если строить графики в основном потоке, то он будет сидеть перед замершим экраном. Или я неправ?


mmb   (2002-08-05 13:09:00) [3]

В ThrDisplay как раз на TCanvas рисуются графики (обычно не менее 100). Оператор с помощью скролинга может видеть процесс в динамике. Если строить графики в основном потоке, то он будет сидеть перед замершим экраном. Это будет как в досе.


Виктор Щербаков   (2002-08-05 12:25:00) [4]

Не совсем понятно, что же нужно!
Нужно чтобы пользователь видел уже прочитанные данные?
Тогда не понятно, почему не хочешь делать отображение в основном потоке (имеется ввиду поток пользовательского интерфейса VCL).
Ведь данные ты читаешь в другом потоке.

А из пиведенного тобой кода нельзя сделать вывод о его правильности/ошибочности, т.к. многое зависит от кода потока ThrDisplay. Ошибки чаще всего возникают из-за пренебрежения тем фактом, что почти все компоненты VCL не имеют средств для многопоточной работы. Приятное исключение - TCanvas с его методами Lock и Unlock.


mmb   (2002-08-05 12:14:00) [5]

В основном потоке не хотельсь бы отображать данные, чтобы оператор мог просматривать те данные, которае уже отобразились.
Формулирую точнее: можно ли сделать так
procedure TThrRead.Execute;
begin
for i := 1 to nt do begin
TraceRead(i);
ThrDisplay.DisplayNum := i;
ThrDisplay.Resume;
end;
end;

Не возникнет ли ошибок?


ACR   (2002-08-05 11:48:00) [6]

У меня возникает другой вопрос как запустить поток НЕ ИЗ ДРУГОГО потока? Как остановить поток НЕ ИЗ ДРУГОГО потока?
переформулируй вопрос....


Виктор Щербаков   (2002-08-05 11:41:00) [7]

Отображать данные можно и в основном потоке, т.е. в потоке пользовательского итерфейса VCL.

Т.е. поток чтения данных может отправлять (PostMessage) сообщение о необходимости отображения очередного блока в одно из окон основного потока.

Но это всё общие слова. Возможны другие варианты.


mmb   (2002-08-05 11:32:00) [8]

Первый поток читает данные, втокой отображает на экране (заведомо быстрее). Первый прочитав блок, запускает второй, а сам продолжает читать сл. блок, а второй отобразив останавливается. И так пока все блоки не считаны.


Виктор Щербаков   (2002-08-05 11:22:00) [9]

Можно.
Зависит от задачи.


Наверх

Титульная страница Поиск, карта сайта Написать письмо