Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.12.2016, 15:18
Аватар для ined
ined ined вне форума
Начинающий
 
Регистрация: 16.11.2008
Адрес: Российская Федерация!! :)
Сообщения: 165
Версия Delphi: Delphi 2010
Репутация: 1272
По умолчанию Разбор Потоков. Моё решение

Я тут задумался о многопоточности приложения, а стандартный метод мне как-то не понравился. И как обычно я полез в дебри....
В итоге получился вот такой модуль.
Что-же он может:
  • Создаёт поток. (Ставит его на паузу)
  • Запускает поток(Перезапускает).
  • Запускает поток циклично.
  • Останавливает цикличный поток.
  • Удаляет поток.
Внутри модуля:
WaitForSingleObject - Ловит поток.
ResetEvent - Останавливает поток.
SetEvent - Запускает поток.
-----------------------------------------------------------
Коментарии от Гуру приветствуются.
Может есть ошибки, а они скорей всего есть!
Вложения
Тип файла: zip MyThread.zip (1.2 Кбайт, 3 просмотров)
__________________
11011111 INED Home code
VK

Последний раз редактировалось ined, 13.12.2016 в 15:26.
Ответить с цитированием
  #2  
Старый 13.12.2016, 15:31
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Для чего это нужно? Для каких задач может быть пригодно?
Лично я, например, пользуюсь пулами, объекты-потоки, как таковые, не использую вообще, управление потоками соуществляю через стандартный монитор потоков.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию

Последний раз редактировалось M.A.D.M.A.N., 13.12.2016 в 15:36.
Ответить с цитированием
  #3  
Старый 13.12.2016, 15:43
Аватар для ined
ined ined вне форума
Начинающий
 
Регистрация: 16.11.2008
Адрес: Российская Федерация!! :)
Сообщения: 165
Версия Delphi: Delphi 2010
Репутация: 1272
По умолчанию

Данный модуль создан в познавательных целях. Так как о потоках в интернете маловато нормальной инфы.
Если есть конкретная критика по модулю или я где-то сделал ошибку в коде, пишите.
__________________
11011111 INED Home code
VK
Ответить с цитированием
  #4  
Старый 13.12.2016, 15:55
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Плохой у вас интернет значит.

Итак, критика:
1. при создании потока необходимо передавать указатель на процедуру и указатель на параметры — не очень удобно, удобнее было бы сделать замыкания.при создании потока необходимо передавать указатель на процедуру и указатель на параметры — не очень удобно, удобнее было бы сделать, как минимум, замыкания (2010 дельфи должна это уметь);
2. после создания потока на выходее имеем некий идентификатор, который банально можно потерять или он как-то изменится по ошибке, тоже не очень удобно, быыло бы удобнее это обернуть как минимум в некий класс (становится похоже на реализацию класса tthread, не так ли?);
3. если я работаю с критической секцией и мне необходимо приостановить поток до возникновения сигнала — как я это реализую приведенными тобой api (в частности, как мне помогут ф-ии PlayThread и StopThread)?
4. ф-я DestroyThread не дает понятия, что он делает, прерывает выполнение потока с завершением, или же высвободает хендл потока, и надо эту ф-ю использовать в try finally блоке?
5. в каком случае нужен StartСycleThread?
6. будет ли код компилироваться под х64 и другие платформы?
ну и 7-е: каким образом это может понять новичкам принципы работы с потоками и чем это лучше «отсутствующей» нормальной документации по потокам?
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #5  
Старый 13.12.2016, 16:21
Аватар для ined
ined ined вне форума
Начинающий
 
Регистрация: 16.11.2008
Адрес: Российская Федерация!! :)
Сообщения: 165
Версия Delphi: Delphi 2010
Репутация: 1272
По умолчанию

Ещё раз повторюсь. Модуль создан в познавательных целях.
Это означает что его удобство в использовании и возможность его как-то применить не обсуждаются.
У каждого подход к потокам разный. Кто-то пользуется классом tThread, а кто-то просто CreateThread.
Попытка показать, что вы негативно относитесь к данному "Велосипеду", вам удалась, но всё-же. Ближе к теме.
__________________
11011111 INED Home code
VK
Ответить с цитированием
  #6  
Старый 13.12.2016, 16:54
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Ну если ближе к теме, то ответ «плохо» устроит?
Перечень замечаний я выдал, ты отмазался на них отвечать, дальше чего обсуждать, если ты не можешь за свой код ответить? Потому см. строку 1.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию

Последний раз редактировалось M.A.D.M.A.N., 13.12.2016 в 16:56.
Ответить с цитированием
  #7  
Старый 13.12.2016, 18:02
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Пример использования приведи, плз
Ладно, погорячился, для самообучения норм код, разобрался с WinAPI и указателями, молодес.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
ined (13.12.2016)
  #8  
Старый 13.12.2016, 18:52
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от ined
Кто-то пользуется классом tThread, а кто-то просто CreateThread.
Так-то в VCL BeginThread() рекомендуется.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #9  
Старый 13.12.2016, 20:18
Аватар для ined
ined ined вне форума
Начинающий
 
Регистрация: 16.11.2008
Адрес: Российская Федерация!! :)
Сообщения: 165
Версия Delphi: Delphi 2010
Репутация: 1272
По умолчанию

Пример использования... Я как то не задумывался. Просто пытался углубиться в познании многопоточного приложения. Вообще-то я разбирал вывод и наложение звуков и разбирая 1 из примеров наткнулся на tThread(Поток) который работал с формированием звука. Но так как я не очень люблю большие программы я решил сделать подобие tThread без подключения дополнительных модулей ну и ещё всякого "Нужного" хлама который раздувает программу. Как и в жизни, Лень - чаще всего приводить к большому весу!
__________________
11011111 INED Home code
VK
Ответить с цитированием
  #10  
Старый 13.12.2016, 20:22
Аватар для ined
ined ined вне форума
Начинающий
 
Регистрация: 16.11.2008
Адрес: Российская Федерация!! :)
Сообщения: 165
Версия Delphi: Delphi 2010
Репутация: 1272
По умолчанию

Цитата:
Сообщение от NumLock
Так-то в VCL BeginThread() рекомендуется.
В этом меня насторожило вот это:
Код:
{$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
Ответить с цитированием
  #11  
Старый 13.12.2016, 20:31
Аватар для ined
ined ined вне форума
Начинающий
 
Регистрация: 16.11.2008
Адрес: Российская Федерация!! :)
Сообщения: 165
Версия Delphi: Delphi 2010
Репутация: 1272
По умолчанию

Ещё мне интересно правильно ли создаётся CriticalSection для потока? И правильно ли я его использую?
__________________
11011111 INED Home code
VK
Ответить с цитированием
  #12  
Старый 13.12.2016, 21:13
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
И зачем это. Я не понял.
По всей видимости, что-то вроде инициализации работы с исключениями и потом вызов точки входа потока.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter