Задание на 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);