Задание на Delphi. Как работают потоки. Убираем подвисание главной формы. #delphi , #TThread для выполнение задачи использовал компоненты и функции Button, TThread, ProgressBar1.
Пікірлер: 32
@pro_delphiАй бұрын
То что делаешь продолжай делать, я бы хотел видеть конечно изложение материала как сравнение "старого" delphi и сопоставление с новой редакцией, ну вот, например, те же потоки как сделать стандартным способом на D7 и как сделать то же самое но современными методами
@KODnyj_RuslanАй бұрын
Нее, мысль сравнения мне не очень. Буду делать как делал
@user-jj1in5zo2qАй бұрын
Как всегда интересные видео уроки! А не могли бы вы записать урок как программно из делфи допустим по нажатию кнопки завершить а потом запустить необходимую мне службу пусть к примеру это будет служба печати windows.
@KODnyj_RuslanАй бұрын
Хорошо, добавил в планы
@nodirsadikov6029Ай бұрын
Привет сделайте урок по веб сервер и методы post put get delete
@KODnyj_RuslanАй бұрын
Попробую
@user-du2mf4zj1pАй бұрын
возможно что я что то не понимаю но разве нельзя поток выделить через таймер?
@KODnyj_RuslanАй бұрын
Обновление прогресс бара через таймер? Можно но это не будет распределение по нескольким ядрам процессора, будет медленный работать и подвисать
@KODnyj_RuslanАй бұрын
Если про вызов потока через таймер, то можно, у меня через цикл сделано что бы было наглядней было
@pro_delphiАй бұрын
Ты это серьезно? каким он спросом пользуется "нулевым"? я позавчера искал вакансию на hh результат: в Иркутской, Красноярском крае, забайкалье, хабаравском, Якутия и т.д. во всем дальневосточном регионе - ноль вакансий! вот это супер популярность!!! это территория больше все Европы
@KODnyj_RuslanАй бұрын
Наверно не так искали, я не говорил что он первый в рейтингах среди других языков, но спросом от пользуется
@user-np1bc8rn2kАй бұрын
Несколько устаревший способ ... сейчас уже все используют класс Ttask
@KODnyj_RuslanАй бұрын
Не все используют. Многим достаточно tthread.
@pro_delphiАй бұрын
Не смешите людей, что Delphi популярен на вашем канале даже подписчиков почти нет: 379 человек смешно даже как тo... вы сами себе противоречите.
@KODnyj_RuslanАй бұрын
Есть каналы по Делфи где есть подписчики и по более, кроме вашего конечно)))
@X0KI3Ай бұрын
Не используем обращение формы из потока. Это не есть хорошо. Для синхронизации используем критическую секцию. Не надо использовать Resume, он давно устарел и его не кто не рекомендует использовать. заместо него используем Start. Вот мой пример. однопоточности и многопоточности. type TMyThread = class(TThread) private FProgress: Integer; protected procedure SetSync; procedure SetEnd; procedure Execute; override; public { Public declarations } end; var Form1: TForm1; // Page: Integer; CriticalSection: TCriticalSection; implementation {$R *.dfm} procedure TMyThread.Execute; var I: Integer; begin CriticalSection.Enter; try for I := 0 to 100 do // за место 100 добавляем Page begin FProgress := I; Synchronize(SetSync); end; Synchronize(SetEnd); finally CriticalSection.Leave; end; end; procedure TMyThread.SetSync; begin Form1.sProgressBar1.Position := FProgress; Form1.sMemo1.Lines.Add('Цикл: ' + FProgress.ToString + ' пройден.'); end; procedure TMyThread.SetEnd; begin Form1.smemo1.Lines.Add('Пройдено: ' + FProgress.ToString + ' циклов.'); end; procedure TForm1.FormCreate(Sender: TObject); begin CriticalSection := TCriticalSection.Create; end; procedure TForm1.sButton1Click(Sender: TObject); var aThread: TMyThread; // aThread: array of TMyThread; I: Integer; для многопоточности begin Form1.sProgressBar1.Position := 0; { // Многопоточность SetLength(AThread, sSpinEdit1.Value); for I := 0 to Length(aThread) - 1 do begin // Page := sSpinEdit1.Value; AThread[I] := TMyThread.Create(True); AThread[I].FreeOnTerminate := True; AThread[I].Start; end; } AThread := TMyThread.Create(True); AThread.FreeOnTerminate := True; AThread.Start; end;
@KODnyj_RuslanАй бұрын
При большом количестве потоков ваш вариант будет безопасней, спасибо
@user-np1bc8rn2kАй бұрын
Вы на какой RAD Studio седите? так делали при царе горохе лет 15 назад
@KODnyj_RuslanАй бұрын
Я не слежу за модой, мне главное что бы работало.
@pro_delphiАй бұрын
Если у вас RAD 10.4 и выше то USES System.Threading, System.Diagnostics, System.SyncObjs TThread.Synchronize(nil, procedure() begin // например, memo1.lines.add('my messages''); end);
@pro_delphiАй бұрын
Но лучше используйте более современный класс MyThrede := TTask.Create(procedure() begin // что то делаем в потоке TThread.Synchronize(nil, procedure() begin // например, что то выводим на форму memo1.lines.add('my messages''); end); end);