![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]Можно.
Зависит от задачи.