Задание на Delphi. Как работают потоки. Убираем подвисание главной формы. #delphi , #TThread для выполнение задачи использовал компоненты и функции Button, TThread, ProgressBar1.
То что делаешь продолжай делать, я бы хотел видеть конечно изложение материала как сравнение "старого" delphi и сопоставление с новой редакцией, ну вот, например, те же потоки как сделать стандартным способом на D7 и как сделать то же самое но современными методами
Как всегда интересные видео уроки! А не могли бы вы записать урок как программно из делфи допустим по нажатию кнопки завершить а потом запустить необходимую мне службу пусть к примеру это будет служба печати windows.
Ты это серьезно? каким он спросом пользуется "нулевым"? я позавчера искал вакансию на hh результат: в Иркутской, Красноярском крае, забайкалье, хабаравском, Якутия и т.д. во всем дальневосточном регионе - ноль вакансий! вот это супер популярность!!! это территория больше все Европы
Не используем обращение формы из потока. Это не есть хорошо. Для синхронизации используем критическую секцию. Не надо использовать 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;
Если у вас RAD 10.4 и выше то USES System.Threading, System.Diagnostics, System.SyncObjs TThread.Synchronize(nil, procedure() begin // например, memo1.lines.add('my messages''); end);
Но лучше используйте более современный класс MyThrede := TTask.Create(procedure() begin // что то делаем в потоке TThread.Synchronize(nil, procedure() begin // например, что то выводим на форму memo1.lines.add('my messages''); end); end);
То что делаешь продолжай делать, я бы хотел видеть конечно изложение материала как сравнение "старого" delphi и сопоставление с новой редакцией, ну вот, например, те же потоки как сделать стандартным способом на D7 и как сделать то же самое но современными методами
Нее, мысль сравнения мне не очень. Буду делать как делал
Как всегда интересные видео уроки! А не могли бы вы записать урок как программно из делфи допустим по нажатию кнопки завершить а потом запустить необходимую мне службу пусть к примеру это будет служба печати windows.
Хорошо, добавил в планы
возможно что я что то не понимаю но разве нельзя поток выделить через таймер?
Привет сделайте урок по веб сервер и методы post put get delete
Попробую
Ты это серьезно? каким он спросом пользуется "нулевым"? я позавчера искал вакансию на hh результат: в Иркутской, Красноярском крае, забайкалье, хабаравском, Якутия и т.д. во всем дальневосточном регионе - ноль вакансий! вот это супер популярность!!! это территория больше все Европы
Наверно не так искали, я не говорил что он первый в рейтингах среди других языков, но спросом от пользуется
Несколько устаревший способ ... сейчас уже все используют класс Ttask
Не все используют. Многим достаточно tthread.
Не смешите людей, что Delphi популярен на вашем канале даже подписчиков почти нет: 379 человек смешно даже как тo... вы сами себе противоречите.
Есть каналы по Делфи где есть подписчики и по более, кроме вашего конечно)))
Не используем обращение формы из потока. Это не есть хорошо.
Для синхронизации используем критическую секцию.
Не надо использовать 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;
При большом количестве потоков ваш вариант будет безопасней, спасибо
Вы на какой RAD Studio седите? так делали при царе горохе лет 15 назад
Я не слежу за модой, мне главное что бы работало.
Если у вас RAD 10.4 и выше то USES System.Threading, System.Diagnostics, System.SyncObjs
TThread.Synchronize(nil, procedure()
begin
// например,
memo1.lines.add('my messages'');
end);
Но лучше используйте более современный класс
MyThrede := TTask.Create(procedure()
begin
// что то делаем в потоке
TThread.Synchronize(nil, procedure()
begin
// например, что то выводим на форму
memo1.lines.add('my messages'');
end);
end);