Показать сообщение отдельно
Старый 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 Кб, 884 просмотров)
Тип файла: zip Threards_example.zip (4.2 Кб, 834 просмотров)

Последний раз редактировалось minibt, 29.05.2009 в 08:59. Причина: Исправлена ошибка последовательного запуска нескольких потоков
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо minibt за это полезное сообщение:
Fred-boy (22.11.2013), Rock2roll (18.02.2012)