![]() |
Параллельные процессы отображения графических элементов? Многопоточная реализация задачи!
Уважаемые пользователи MidletPascal!
Воспользовавшись советами по стандартной процедуре setClip и модулю Lib_threads.class предпринял попытку реализации многопоточной задачи, согласно которой два элемента с размещением в верхней части(каретка) и нижней части экрана(панель поиска), парраленьно и независимо друг от друга должны, как два независимых друг от друга потока, присутствовать и отсутствовать на экране в режиме showCanvas в течении следующих временных интервалов, каждый элемент соответствеено: каретка 1 сек. на присутствие и 1 сек. на отсутствие; панель поиска 2 сек. на присутствие и 2 сек. на отсутстуие. Повторяя условие, согласно которому оба элемента должны работать независимо друг от друга как два независимых параллельных потока, я не убедился их многопоточной и независимой работе. В чём же дело? Что заствляет задачу вести себя как однопоточный процесс. C уважением MidletUser. Код попытки реализации задачи: program NewProject1; uses threads; var first_run: boolean; //Используем для прерывания работы потока 1 var img: image; procedure carrier(); begin while first_run = true do begin showCanvas; setColor(0,0,0); drawText('I',0,0); repaint; delay(1000); showCanvas; setClip(0,0,240,14); setColor(0,255,255); fillRect(0,0,240,14); repaint; delay(1000); end; end; procedure pict(); begin while first_run = true do begin showCanvas; drawImage(loadImage('/search.png'), 0, 300); repaint; delay(2000); showCanvas; setClip(0,300,240,20); setColor(255,255,255); fillRect(0,300,240,20); repaint; delay(2000); end; end; procedure thread_id(Uid: integer); begin while first_run = true do begin if Uid = 1 then carrier; if Uid = 2 then pict; end; end; begin first_run := true; while first_run = true do begin threads_start(1); threads_start(2); end; end. |
Ответ: Параллельные процессы отображения графических элементов? Многопоточная реализация задачи!
Конкретно данный код не проверял, но судя по тому, как реализован вызов процедур, могу сказать, что библиотека в принципе не обеспечивает многопоточности.
Попробуйте использовать Lib_multithread Я пробовал такой код, он немного изменен по сравнению с Вашим, но принцип вроде бы тот же: PHP код:
-обязательно добавить все 5 файлов T1.class...T5.class в ресурсы проекта, даже если потоков только два; -имена процедур должны быть именно p1, p2...p5 и никакие другие (можно описать только те процедуры, которые нужны). |
Ответ: Параллельные процессы отображения графических элементов? Многопоточная реализация задачи!
Я тебе еще в предыдущей теме говорил, что рисовать в разных потоках нельзя. В 2х разных потоках используется разное время. И поэтому при использовании SetClip в 1 потоке может случиться такая ситуация.
В 1м потоке вызывается SetClip для 1 региона В этот момент вызывается отрисовка для 2 региона //Второй регион не отрисуется И из=за таких мелочей возникает много различных непоняток. И все они связаны с десинхронизацией потоков. Как вариант делать специальную систему сообщений. Или же использовать метод объектной отрисовки. Данные были получены при написании графической части Псевдо ОС gainOS |
Часовой пояс GMT +4, время: 00:52. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot