Вот, можете посмотреть код как я работал, это не низкий уровень(не совсем понятно зачем вам именно низкий уровень), но чтоб придти к такому решению не одну ночь не спать пришлось.
http://community.develstudio.ru/atta...0&d=1314949577
ds очень капризна по части потоков я пока писал код, раза 3 его структуру с нуля переписывал. Вобщем из найденных мной камней:
1) не используйте алгоритм "создал запустил поработал уничтожил(free)", ds не освобождает память после потоков. Будет утечка памяти. Если использовать алгоритм "создал запустил поработал уничтожил(free)" где то раз 2000, это отожрёт 4 гига оперативки.
2) алгоритм "создал запустил поработал(, заново запустил, с новыми данными, поработал)* N раз" тоже не реккомендую. Будут "плавающие баги" совершенно в не ожиданных местах, будут теряться ф-и, могут даже потеряться целые ссылки на треду, где то после 6000 раз когда так сделаете. Его можно использовать безопасно если потоков будет не много и за время работы программы N не будет больше 1000
Единственный пока что безглючный вариант который я нашёл это чтоб запущенный поток на время работы программы "не когда не кончался", когда ему нечего делать пускай находится в состоянии suspend или тупо ничего не делает т.е. код потока аля:
PHP код:
while(true)
{
do
{
получаем данные через v();
delay(1000);
}while(нет данных для обработки)
оборабатываем полученные данные
}
Но suspend лучше.
--------------------------------

Сообщение от
Phantom
У меня возникла задача останавливать поток извне. Пробовал много вариантов методом тыка. Единственный вроде бы внешне рабочий как мне надо вариант - это вызов thread_suspend($thread_id). И к моему удивлению это работает на ура. Поток реально замораживается моментально, и при закрытии приложения не выскакивает никаких левых фатальных ошибок.
1) насколько я понял stop тупо ничего не делает, толи это баг. толи код этой процедуры ещё просто не реализован, но остановить у меня не вышло как не пытался.
2) suspend не останавливает треду, он её замораживает, потом она продолжает работу с того места где была во время приостановки.
Чтоб остановить треду я пользовался кодом
PHP код:
while(v('ThreadsWorkingOn'))
{
делаем чёта полезное но не большое
If(!v('ThreadsWorkingOn'))
{
Break;
}
делаем чёта полезное но не большое
If(!v('ThreadsWorkingOn'))
{
Break;
}
делаем чёта полезное но не большое
If(!v('ThreadsWorkingOn'))
{
Break;
}
делаем чёта полезное но не большое
}
Данным кодом вы убьёте двух зайцев, первый прекратит работу когда вы установите v('ThreadsWorkingOn', false) в основном коде программы. Во вторых вы никогда, ещё раз вопторяю вы не когда не прервёте треду не дав ей не корректно завершиться, например скажем во время перзаписи файла с данными сделав его повреждённым и не полным, т.к сами втыкаете в код "брэйки" где треда по требованию может безопасно завершиться. (в том примере выше что я дал ссылку, нет такого кода, о котором щас реч веду, в виду особенности той программы)

Сообщение от
Phantom
Но вот что меня смущает... thread_suspend замораживает поток, а не останавливает. И его потом можно продолжить методом thread_start или thread_resume (второй не проверял, но по идее работать должно по своему назначению). Но как мне полностью остановить поток и по возможности выгрузить из памяти?
Правильнее использовать resume

Сообщение от
Phantom
Но внешне для пользователя приложения это выглядит некрасиво. Поток завершает свою работу спустя какое-то время после нажатия на кнопку.
В этом нет ничего не красивого, создайте "статус строку" и напишите пользователю "завершаю работу". Это правильный выход, с точки зрения целостности информации. Весь софт что я видел и который работает с какими то данными так делает, потоки не когда не завершаются сиюжесекунду по нажатию кнопочки отмета. Самый простой тому пример установщик любой программы, ставил пользователь её, ставил, потом передумал и нажал отмена. Если установщик прервёт работу сиже секунду. что будет у пользователя на компе? Куча мусора от недоустановленной программы. Так что это вполне нормально если поток завершится не сразу. Могу кинуть пример такой реализации.

Сообщение от
Phantom
Кроме того, если закрыть приложение на крестик главного окна в то время, когда работает в фоне поток, то выскакиевает фатальная ошибка с просьбой отправить отчёт и ещё одна по поводу того, что я вызываю метод компонента формы из несуществующего объекта.
Вообще по хорошему надо блокировать такие нажатия во время работы потоков и при нажатии сначала запускать механизм остановки потоков (v(...)) а потом позволять приложению завершится, иначе вы рискуете получить испорченные/не завершённые данные и файлы, если ваша программа с чем то работает.

Сообщение от
Phantom
Ну и логичный, как мне кажется, вопрос: почему функция thread_stop не работает? Или она работает не так, как я предполагаю. Я уж не говорю про другие экзотические функции типа thread_terminateandwaitfor, которые и подавное непонятно как и для чего использовать.
Их либо не реализовали до конца. либо там просто баг
З.Ы. если уж очень сильно хотите посмотреть как эти низкоуровневые процедуры юзать, можете посмотреть файл \PHP Devel Studio 2.0 beta\engine_sdk\main\threads.php там находится класс Thread