|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Разбор Потоков. Моё решение
Я тут задумался о многопоточности приложения, а стандартный метод мне как-то не понравился. И как обычно я полез в дебри....
В итоге получился вот такой модуль. Что-же он может:
WaitForSingleObject - Ловит поток. ResetEvent - Останавливает поток. SetEvent - Запускает поток. ----------------------------------------------------------- Коментарии от Гуру приветствуются. Может есть ошибки, а они скорей всего есть! 11011111 INED Home code VK Последний раз редактировалось ined, 13.12.2016 в 15:26. |
#2
|
||||
|
||||
Для чего это нужно? Для каких задач может быть пригодно?
Лично я, например, пользуюсь пулами, объекты-потоки, как таковые, не использую вообще, управление потоками соуществляю через стандартный монитор потоков. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию Последний раз редактировалось M.A.D.M.A.N., 13.12.2016 в 15:36. |
#3
|
||||
|
||||
Данный модуль создан в познавательных целях. Так как о потоках в интернете маловато нормальной инфы.
Если есть конкретная критика по модулю или я где-то сделал ошибку в коде, пишите. 11011111 INED Home code VK |
#4
|
||||
|
||||
Плохой у вас интернет значит.
Итак, критика: 1. при создании потока необходимо передавать указатель на процедуру и указатель на параметры — не очень удобно, удобнее было бы сделать замыкания.при создании потока необходимо передавать указатель на процедуру и указатель на параметры — не очень удобно, удобнее было бы сделать, как минимум, замыкания (2010 дельфи должна это уметь); 2. после создания потока на выходее имеем некий идентификатор, который банально можно потерять или он как-то изменится по ошибке, тоже не очень удобно, быыло бы удобнее это обернуть как минимум в некий класс (становится похоже на реализацию класса tthread, не так ли?); 3. если я работаю с критической секцией и мне необходимо приостановить поток до возникновения сигнала — как я это реализую приведенными тобой api (в частности, как мне помогут ф-ии PlayThread и StopThread)? 4. ф-я DestroyThread не дает понятия, что он делает, прерывает выполнение потока с завершением, или же высвободает хендл потока, и надо эту ф-ю использовать в try finally блоке? 5. в каком случае нужен StartСycleThread? 6. будет ли код компилироваться под х64 и другие платформы? ну и 7-е: каким образом это может понять новичкам принципы работы с потоками и чем это лучше «отсутствующей» нормальной документации по потокам? — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#5
|
||||
|
||||
Ещё раз повторюсь. Модуль создан в познавательных целях.
Это означает что его удобство в использовании и возможность его как-то применить не обсуждаются. У каждого подход к потокам разный. Кто-то пользуется классом tThread, а кто-то просто CreateThread. Попытка показать, что вы негативно относитесь к данному "Велосипеду", вам удалась, но всё-же. Ближе к теме. 11011111 INED Home code VK |
#6
|
||||
|
||||
Ну если ближе к теме, то ответ «плохо» устроит?
Перечень замечаний я выдал, ты отмазался на них отвечать, дальше чего обсуждать, если ты не можешь за свой код ответить? Потому см. строку 1. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию Последний раз редактировалось M.A.D.M.A.N., 13.12.2016 в 16:56. |
#7
|
||||
|
||||
Пример использования приведи, плз
Ладно, погорячился, для самообучения норм код, разобрался с WinAPI и указателями, молодес. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
ined (13.12.2016)
|
#8
|
||||
|
||||
Цитата:
Пишу программы за еду. __________________ |
#9
|
||||
|
||||
Пример использования... Я как то не задумывался. Просто пытался углубиться в познании многопоточного приложения. Вообще-то я разбирал вывод и наложение звуков и разбирая 1 из примеров наткнулся на tThread(Поток) который работал с формированием звука. Но так как я не очень люблю большие программы я решил сделать подобие tThread без подключения дополнительных модулей ну и ещё всякого "Нужного" хлама который раздувает программу. Как и в жизни, Лень - чаще всего приводить к большому весу!
11011111 INED Home code VK |
#10
|
||||
|
||||
Цитата:
Код:
{$IFDEF MSWINDOWS} function ThreadWrapper(Parameter: Pointer): Integer; stdcall; {$ELSE} function ThreadWrapper(Parameter: Pointer): Pointer; cdecl; {$ENDIF} asm {$IFDEF PC_MAPPED_EXCEPTIONS} { Mark the top of the stack with a signature } PUSH UNWINDFI_TOPOFSTACK {$ENDIF PC_MAPPEDEXCEPTIONS} CALL _FpuInit PUSH EBP {$IFNDEF PC_MAPPED_EXCEPTIONS} XOR ECX,ECX PUSH offset _ExceptionHandler MOV EDX,FS:[ECX] PUSH EDX MOV FS:[ECX],ESP {$ENDIF !PC_MAPPED_EXCEPTIONS} {$IFDEF PC_MAPPED_EXCEPTIONS} // The signal handling code in SysUtils depends on being able to // discriminate between Delphi threads and foreign threads in order // to choose the disposition of certain signals. It does this by // testing a TLS index. However, we allocate TLS in a lazy fashion, // so this test can fail unless we've already allocated the TLS segment. // So we force the allocation of the TLS index value by touching a TLS // value here. So don't remove this silly call to AreOSExceptionsBlocked. CALL AreOSExceptionsBlocked {$ENDIF PC_MAPPED_EXCEPTIONS} MOV EAX,Parameter MOV ECX,[EAX].TThreadRec.Parameter MOV EDX,[EAX].TThreadRec.Func PUSH ECX PUSH EDX CALL _FreeMem POP EDX POP EAX CALL EDX {$IFNDEF PC_MAPPED_EXCEPTIONS} XOR EDX,EDX POP ECX MOV FS:[EDX],ECX POP ECX {$ENDIF !PC_MAPPED_EXCEPTIONS} POP EBP {$IFDEF PC_MAPPED_EXCEPTIONS} { Ditch our TOS marker } ADD ESP, 4 {$ENDIF PC_MAPPED_EXCEPTIONS} end; 11011111 INED Home code VK |
#12
|
||||
|
||||
Цитата:
jmp $ ; Happy End! The Cake Is A Lie. |