Форум: "Основная";
Текущий архив: 2002.08.19;
Скачать: [xml.tar.bz2];
ВнизThreads: можно ли из одного потока запустить и остановить другой Найти похожие ветки
← →
mmb (2002-08-05 11:18) [0]Можно ли из Execute одного потока запустить или остановить другой поток, эффективно ли такое взаимодействие потоков?
← →
Виктор Щербаков (2002-08-05 11:22) [1]Можно.
Зависит от задачи.
← →
mmb (2002-08-05 11:32) [2]Первый поток читает данные, втокой отображает на экране (заведомо быстрее). Первый прочитав блок, запускает второй, а сам продолжает читать сл. блок, а второй отобразив останавливается. И так пока все блоки не считаны.
← →
Виктор Щербаков (2002-08-05 11:41) [3]Отображать данные можно и в основном потоке, т.е. в потоке пользовательского итерфейса VCL.
Т.е. поток чтения данных может отправлять (PostMessage) сообщение о необходимости отображения очередного блока в одно из окон основного потока.
Но это всё общие слова. Возможны другие варианты.
← →
ACR (2002-08-05 11:48) [4]У меня возникает другой вопрос как запустить поток НЕ ИЗ ДРУГОГО потока? Как остановить поток НЕ ИЗ ДРУГОГО потока?
переформулируй вопрос....
← →
mmb (2002-08-05 12:14) [5]В основном потоке не хотельсь бы отображать данные, чтобы оператор мог просматривать те данные, которае уже отобразились.
Формулирую точнее: можно ли сделать так
procedure TThrRead.Execute;
begin
for i := 1 to nt do begin
TraceRead(i);
ThrDisplay.DisplayNum := i;
ThrDisplay.Resume;
end;
end;
Не возникнет ли ошибок?
← →
Виктор Щербаков (2002-08-05 12:25) [6]Не совсем понятно, что же нужно!
Нужно чтобы пользователь видел уже прочитанные данные?
Тогда не понятно, почему не хочешь делать отображение в основном потоке (имеется ввиду поток пользовательского интерфейса VCL).
Ведь данные ты читаешь в другом потоке.
А из пиведенного тобой кода нельзя сделать вывод о его правильности/ошибочности, т.к. многое зависит от кода потока ThrDisplay. Ошибки чаще всего возникают из-за пренебрежения тем фактом, что почти все компоненты VCL не имеют средств для многопоточной работы. Приятное исключение - TCanvas с его методами Lock и Unlock.
← →
mmb (2002-08-05 13:09) [7]В ThrDisplay как раз на TCanvas рисуются графики (обычно не менее 100). Оператор с помощью скролинга может видеть процесс в динамике. Если строить графики в основном потоке, то он будет сидеть перед замершим экраном. Это будет как в досе.
← →
mmb (2002-08-06 11:47) [8]В ThrDisplay как раз на TCanvas рисуются графики (обычно не менее 100, часто гораздо больше несколько тысяч). Оператор с помощью скролинга может видеть процесс в динамике. Если строить графики в основном потоке, то он будет сидеть перед замершим экраном. Или я неправ?
← →
ACR (2002-08-06 12:11) [9]>mmb
>то он будет сидеть перед замершим экраном. Это будет как в досе
хорошо сказал...
:-)
а даже если и в потоке канвас будешь локать всеравно получится "как в досе" :-)
зделай без потоков
примерно вот так
j = 0;
P = 10;
for(i=0;i<количество графиков;i++)
{
рисуем график(i);
j++;
if (j==P)
{
j=0; //суда мы будем попадать после каждого десятого графика... здесь вызываешь Repaint() того об"екта на котором ресуеш... еще можно(нужно?) вставит Application->ProcessMessage()
тогда можно реализовать кнопочку Cancel... чтобы все эти "репаинты" не тормозили дело то в зависимости от количество графиков можно увеличить или уменьшить P или даже дать пользователю самому настроить этот параметр... ИМХО очень хорошая методика... всебы так делали... а то бывает сидишь как в досе :-)
}
}
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.08.19;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c