forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Библиотеки (http://forum.boolean.name/forumdisplay.php?f=124)
-   -   Lib_threads - динамические потоки (выполнение процедур в отдельных потоках, параллельно основной программе) (http://forum.boolean.name/showthread.php?t=8395)

minibt 28.05.2009 16:46

Lib_threads - динамические потоки (выполнение процедур в отдельных потоках, параллельно основной программе)
 
Вложений: 2
Позволяет создать динамично несколько потоков в программе.

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.

PHP код:

procedure thread_id(Uidinteger);
begin
  
// sometimes code
  // if Uid then ...
end

Пример:

PHP код:

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


ViNT 28.05.2009 20:08

Ответ: Lib_threads - динамические потоки (выполнение процедур в отдельных потоках, параллельно основной программе)
 
А можно увидеть рабочий пример использования библиотеки?
Тестировал на таком коде:
PHP код:

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

По идее, должен выводить на экран два числа, обновляя их значения с разным интервалом, для каждого числа свой поток.

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

На этой же логике тестировал свою библиотеку для реализации потоков - работало.

minibt 28.05.2009 22:40

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

Вставить delay() и все заработает:
PHP код:

begin 
    threads_start
(1); 
    
delay(100); // <<< пауза основного потока, инициализация потока 1
    
threads_start(2); 
    
threads_setpriority(1,threads_norm); 
    
threads_setpriority(2,threads_norm); 
     
    
delay(200000000); 
end


ViNT 28.05.2009 22:55

Ответ: Lib_threads - динамические потоки (выполнение процедур в отдельных потоках, параллельно основной программе)
 
Библиотека интересная, сам давно писал нечто подобное, но тогда мне не удалось реализовать произвольное количество потоков.

Только небольшая просьба - старайтесь оформлять свои библиотеки в соответствии с правилами.

minibt 29.05.2009 09:17

Re: Lib_threads - динамические потоки (выполнение процедур в отдельных потоках, параллельно основной программе)
 
Сорри что криво оформляю, вырываю из рабочих проектов по живому :)

minibt 29.05.2009 09:20

Re: Lib_threads - динамические потоки (выполнение процедур в отдельных потоках, параллельно основной программе)
 
Все подправил, Delay() можно не добавлять, перебивать друг друга больше не будут. Пример добавил.

odd 30.05.2009 21:49

Ответ: Lib_threads - динамические потоки (выполнение процедур в отдельных потоках, параллельно основной программе)
 
Молодца. Чем создавать 10 процедур-обработчиков потоков, легче создать 1 толковый обработчик. Я вот только боюсь, что часть данных будет теряться из-за конфликта потоков, например, когда сортируешь один массив в два потока для скорости. В Java для этого есть хитрое словечко synchronized, а вот в MP нет возможности использовать синхронизацию.

cherepets 15.01.2010 14:30

Ответ: Lib_threads - динамические потоки (выполнение процедур в отдельных потоках, параллельно основной программе)
 
Вложений: 1
ну, в отличие от другой либы для потоков эта работает)))
но возник вопрос почему не пускаются потоки из модуля?
в смысле вот так не работает:


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot