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

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

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

Ответ
 
Опции темы
Старый 28.05.2009, 16:46   #1
minibt
AnyKey`щик
 
Регистрация: 27.03.2007
Сообщений: 13
Написано 5 полезных сообщений
(для 29 пользователей)
Lib_threads - динамические потоки (выполнение процедур в отдельных потоках, параллельно основной программе)

Позволяет создать динамично несколько потоков в программе.

procedure threads_start(Uid: Integer);
Создает поток, заданный уникальным индетификатором, и ставит его в очередь потоков,
после запуска, в основной программе вызывается thread_id(Uid: Integer) с Uid этого потока.
Uid любое число. В дальнейшем используется для обработки данного потока.
Внимание! Если повторно вызвать threads_start с таким же Uid, тогда,
если поток Uid уже закончил работу будет создан новый поток с этим же Uid и повторно вызвана процедура-обработчик,
в противном случае поток просто продолжит свою работу, а повторный запрос игнорируется.

procedure threads_stop(Uid: Integer);
Прерывает работу потока Uid.
Работает только на части телефонов MIDP2.0/CLDC1.1, не рекомендуется к использованию, остановку производить из программы.

procedure threads_stop_all();
Прерывает работу всех созданных потоков.
Работает только на части телефонов MIDP2.0/CLDC1.1, не рекомендуется к использованию, остановку производить из программы.

function threads_isactive(Uid: Integer): Integer;
Возвращает состояние потока Uid.
1 - поток выполняется в данный момент.
0 - поток завершил работу, статус готов к удалению.
-1 - поток удален или не существует.

function threads_getpriority(Uid: Integer): Integer;
Возвращает приоритет потока Uid.

procedure threads_setpriority(Uid, priority: Integer);
Устанавливает приоритет для потока Uid.

Числовое представление значений приоритета потока. Для использования в get/setpriority:
function threads_max: Integer;
Максимальный приоритет.
function threads_min: Integer;
Минимальный.
function threads_norm: Integer;
Обычный.

В основной код программы добавить!
Процедура вызывается при запуске потока UId.

procedure thread_id(Uidinteger);
begin
  
// sometimes code
  // if Uid then ...
end
Пример:

program Example;
uses threads;
var
    
first_runboolean//Используем для прерывания работы потока 1
   
 
procedure first;
begin
first_run
:= true;
  while 
first_run do
    
begin
      
...// какой то код
    
end;
end;
 
procedure second;
begin
...// какой то код
// поток 1 еще выполняется? Снизим свой (777) приоритет, отдадим ресурсы
if threads_isactive(1)=1 then threads_setpriority(777threads_min);
...
// какой то код
end;
 
//процедура обработчик потоков, 
//вызывается при запуске потока, предавая Uid потока
procedure thread_id(Uidinteger);
  
begin
    
if Uid=1 then first
    if 
Uid=777 then second;
  
end;
 
begin
  
... // какой то код
  
  
threads_start(1); // создаем новый поток с Uid 1
  
  
...// какой то код
  
...// какой то код
  
  
threads_start(777); // создаем новый поток с Uid 777
  
  
...// какой то код
  
  // если поток 777 завершил работу или не существует выполняем поток 777 вновь
  
if threads_isactive(777)<>1 then threads_start(777);
  
  ...
// какой то код
  
  // останавливаем поток 1 
  // threads_stop(1); // не рекомендуется! Работает только на части телефонов MIDP2.0/CLDC1.1
  
first_run:= false

end
Вложения
Тип файла: zip Lib_threads.zip (2.1 Кб, 855 просмотров)
Тип файла: zip Threards_example.zip (4.2 Кб, 801 просмотров)

Последний раз редактировалось minibt, 29.05.2009 в 08:59. Причина: Исправлена ошибка последовательного запуска нескольких потоков
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо minibt за это полезное сообщение:
Fred-boy (22.11.2013), Rock2roll (18.02.2012)
Старый 28.05.2009, 20:08   #2
ViNT
Модератор
 
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений
(для 817 пользователей)
Ответ: Lib_threads - динамические потоки (выполнение процедур в отдельных потоках, параллельно основной программе)

А можно увидеть рабочий пример использования библиотеки?
Тестировал на таком коде:
program threadstest;
uses threads;

procedure p1;
var
 
i1:integer;
begin
 
while true do
 
begin
 i1
:=i1+1;
 
drawtext(integertostring(i1),10,10);
 
repaint;
 
delay(1000);
 
end;
end;

procedure p2;
var
 
i2:integer;
begin
while true do
begin
 i2
:=i2+1;
 
drawtext(integertostring(i2),10,30);
 
repaint;
 
delay(2000);
 
end;
end;

procedure thread_id(uid:integer);
begin
 
if uid=1 then p1;
 if 
uid=2 then p2;
end;

begin
    threads_start
(1);
    
threads_start(2);
    
threads_setpriority(1,threads_norm);
    
threads_setpriority(2,threads_norm);
    
    
delay(200000000);
end
По идее, должен выводить на экран два числа, обновляя их значения с разным интервалом, для каждого числа свой поток.

Только почему-то обновляется только второй поток.

На этой же логике тестировал свою библиотеку для реализации потоков - работало.
(Offline)
 
Ответить с цитированием
Старый 28.05.2009, 22:40   #3
minibt
AnyKey`щик
 
Регистрация: 27.03.2007
Сообщений: 13
Написано 5 полезных сообщений
(для 29 пользователей)
Re: Lib_threads - динамические потоки (выполнение процедур в отдельных потоках, параллельно основной программе)

Все правильно , забыл про особенность одну реализации потоков, у меня запуск потоков происходит из одного потока, они встают в очередь потоков и могут перебивать друг друга, особенно если вызывать их друг за другом. Добавлять Delay(100); и все OK! Исправлю позже чтоб не было коллизий, если конечно развитие этой библиотеки интересно.

Вставить delay() и все заработает:
begin 
    threads_start
(1); 
    
delay(100); // <<< пауза основного потока, инициализация потока 1
    
threads_start(2); 
    
threads_setpriority(1,threads_norm); 
    
threads_setpriority(2,threads_norm); 
     
    
delay(200000000); 
end
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ViNT (28.05.2009)
Старый 28.05.2009, 22:55   #4
ViNT
Модератор
 
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений
(для 817 пользователей)
Ответ: Lib_threads - динамические потоки (выполнение процедур в отдельных потоках, параллельно основной программе)

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

Только небольшая просьба - старайтесь оформлять свои библиотеки в соответствии с правилами.
(Offline)
 
Ответить с цитированием
Старый 29.05.2009, 09:17   #5
minibt
AnyKey`щик
 
Регистрация: 27.03.2007
Сообщений: 13
Написано 5 полезных сообщений
(для 29 пользователей)
Re: Lib_threads - динамические потоки (выполнение процедур в отдельных потоках, параллельно основной программе)

Сорри что криво оформляю, вырываю из рабочих проектов по живому
(Offline)
 
Ответить с цитированием
Старый 29.05.2009, 09:20   #6
minibt
AnyKey`щик
 
Регистрация: 27.03.2007
Сообщений: 13
Написано 5 полезных сообщений
(для 29 пользователей)
Re: Lib_threads - динамические потоки (выполнение процедур в отдельных потоках, параллельно основной программе)

Все подправил, Delay() можно не добавлять, перебивать друг друга больше не будут. Пример добавил.
(Offline)
 
Ответить с цитированием
Старый 30.05.2009, 21:49   #7
odd
Мастер
 
Аватар для odd
 
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений
(для 713 пользователей)
Ответ: Lib_threads - динамические потоки (выполнение процедур в отдельных потоках, параллельно основной программе)

Молодца. Чем создавать 10 процедур-обработчиков потоков, легче создать 1 толковый обработчик. Я вот только боюсь, что часть данных будет теряться из-за конфликта потоков, например, когда сортируешь один массив в два потока для скорости. В Java для этого есть хитрое словечко synchronized, а вот в MP нет возможности использовать синхронизацию.
(Offline)
 
Ответить с цитированием
Старый 15.01.2010, 14:30   #8
cherepets
Бывалый
 
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений
(для 215 пользователей)
Ответ: Lib_threads - динамические потоки (выполнение процедур в отдельных потоках, параллельно основной программе)

ну, в отличие от другой либы для потоков эта работает)))
но возник вопрос почему не пускаются потоки из модуля?
в смысле вот так не работает:
Вложения
Тип файла: rar threadtest.rar (8.1 Кб, 673 просмотров)
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамические массивы Randomize 2D-программирование 8 06.08.2009 23:09
Одновремен. выполнение нескольких процедур SAW-IV Основной форум 10 23.02.2009 20:00
динамические массивы или их аналог ddwarf Основной форум 1 26.08.2008 00:18
Динамические массивы + перегруженный конструктор HolyDel C++ 6 03.05.2007 12:23


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


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