Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для мобильных телефонов > MidletPascal > Основной форум

Основной форум Сюда все проблемы связанные с программированием.

Ответ
 
Опции темы
Старый 08.09.2011, 06:03   #1
MidletUser
AnyKey`щик
 
Регистрация: 11.08.2011
Сообщений: 8
Написано одно полезное сообщение
Параллельные процессы отображения графических элементов? Многопоточная реализация задачи!

Уважаемые пользователи 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.
(Offline)
 
Ответить с цитированием
Старый 08.09.2011, 18:29   #2
ViNT
Модератор
 
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений
(для 817 пользователей)
Ответ: Параллельные процессы отображения графических элементов? Многопоточная реализация задачи!

Конкретно данный код не проверял, но судя по тому, как реализован вызов процедур, могу сказать, что библиотека в принципе не обеспечивает многопоточности.

Попробуйте использовать Lib_multithread

Я пробовал такой код, он немного изменен по сравнению с Вашим, но принцип вроде бы тот же:

program threadtest;
uses multithread;

procedure p1;//первый поток
begin
 
while true do
 
begin
  setColor
(0,0,0);
  
drawText('I',0,0);
  
repaint;
  
delay(500);
  
setColor(0,255,255);
  
fillRect(0,0,GetWidth,14);
  
repaint;
  
delay(500);
 
end;
end;

procedure p2;//второй поток
begin
 
while true do
 
begin
 drawImage
(loadImage('/icon.png'), 0100);
 
repaint;
 
delay(2000);
 
//showCanvas;
 
setColor(255,255,255);
 
fillRect(0,100,240,20);
 
repaint;
 
delay(2000);
 
end;
end;

begin
  init
(1);//Инициализируем первый поток
  
init(2);//Инициализируем второй поток
  
start(1);//Запускаем первый поток
  
start(2);//Запускаем второй поток
  
delay(1000000);//Здесь может быть все, что угодно, это основной поток мидлета.
end
Для того, чтобы все сработало, нужно:
-обязательно добавить все 5 файлов T1.class...T5.class в ресурсы проекта, даже если потоков только два;
-имена процедур должны быть именно p1, p2...p5 и никакие другие (можно описать только те процедуры, которые нужны).
(Offline)
 
Ответить с цитированием
Старый 08.09.2011, 18:32   #3
alexprey
ПроЭктировщик
 
Регистрация: 22.10.2010
Сообщений: 196
Написано 16 полезных сообщений
(для 30 пользователей)
Ответ: Параллельные процессы отображения графических элементов? Многопоточная реализация задачи!

Я тебе еще в предыдущей теме говорил, что рисовать в разных потоках нельзя. В 2х разных потоках используется разное время. И поэтому при использовании SetClip в 1 потоке может случиться такая ситуация.
В 1м потоке вызывается SetClip для 1 региона
В этот момент вызывается отрисовка для 2 региона //Второй регион не отрисуется
И из=за таких мелочей возникает много различных непоняток. И все они связаны с десинхронизацией потоков. Как вариант делать специальную систему сообщений. Или же использовать метод объектной отрисовки.
Данные были получены при написании графической части Псевдо ОС gainOS
__________________
Для меня нет ничего не реального в кодинге, но мне лень
gainOS - прорыв в проектировании ОС на MIDlet Pascal
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 11:42.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com