powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Зависание GUI
25 сообщений из 53, страница 2 из 3
Зависание GUI
    #39591084
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самый простой, пример кода - который демонстрирует, удобство использования потоков

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TForm1.Button1Click(Sender: TObject);
begin
  TThread.Synchronize(TThread.CurrentThread,
    procedure
    begin
      while ProgressBar1.Position < ProgressBar1.Max do
      begin
        ProgressBar1.Position := ProgressBar1.Position + 1;

        SleepEx(10, true);
      end;
    end);
end;
...
Рейтинг: 0 / 0
Зависание GUI
    #39591087
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот так, создавать анонимные потоки. Не связывая с внешным потоком

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
procedure TForm1.Button1Click(Sender: TObject);
var
  Thread: TThread;
begin
  Thread := TThread.CreateAnonymousThread(
    procedure
    begin
      while ProgressBar1.Position < ProgressBar1.Max do
      begin
        ProgressBar1.Position := ProgressBar1.Position + 1;

        SleepEx(10, true);
      end;
    end);
  Thread.Start;
end;
...
Рейтинг: 0 / 0
Зависание GUI
    #39591125
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшиккоторый демонстрирует, удобство использования потоковЗапускать пробовал?
...
Рейтинг: 0 / 0
Зависание GUI
    #39591127
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockКод не пробовал с телефона пишу.
По идее этот код должен так же "зависать", как и у ТС.

Док, возможно, если ты это на Лазаре написал, там могли впихнуть и Update, а не только Invalidate, внутрь "Position:=".
я про sleep написал, потому что это наиболее близкая и понятная аналогия его do_something :)

В Лазаре все устроено абсолютно точно также, как и внутри Дельфей. Поэтому, без многопоточности здесь не обойтись, как бы ТС не пытался избежать понимания этого :)
...
Рейтинг: 0 / 0
Зависание GUI
    #39591129
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

На Токио всё работает. А что???
...
Рейтинг: 0 / 0
Зависание GUI
    #39591130
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для лазура

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
procedure Test;
begin
   while Form1.ProgressBar1.Position < Form1.ProgressBar1.Max do
   begin
     Form1.ProgressBar1.Position := Form1.ProgressBar1.Position + 1;
     Sleep(10);
   end;
 end;


procedure TForm1.Button1Click(Sender: TObject);
var
  Thread: TThread;
begin
  Thread := TThread.CreateAnonymousThread(  @Test);
  Thread.Start;
end;   
...
Рейтинг: 0 / 0
Зависание GUI
    #39591131
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикНа Токио всё работает. А что???Пытаюсь уразуметь смысл вызова Synchronize из главного потока
...
Рейтинг: 0 / 0
Зависание GUI
    #39591149
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Это просто два примера - лёгких. Которые демонстрируют, что страшные ленты потоков остались в прошлом
...
Рейтинг: 0 / 0
Зависание GUI
    #39591157
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикЭто просто два примераЭти два примера - идиотские. Первый вызывает Syncrinize в главном потоке, хотя четко же написаноWarning: Do not call Synchronize from within the main thread. This can cause an infinite loop.
Второй создает новый поток и из него обращается с свойствам VCL-объектов
...
Рейтинг: 0 / 0
Зависание GUI
    #39591167
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Михаил Евгеньевич,

win 10 FaCkingUpdate?
...
Рейтинг: 0 / 0
Зависание GUI
    #39591175
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикСамый простой, пример кода - который демонстрирует, удобство использования потоков
Кроме того, что сказал Василиск, хочу отметить еще одно.
Всё это "удобство" улетает в трубу, когда необходимо завершить поток.
А иметь возможность завершать потоки вручную (а не дожидаясь, пока он сам закончится) необходимо практически всегда, как показывает практика.
...
Рейтинг: 0 / 0
Зависание GUI
    #39591176
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшикчто страшные ленты потоков остались в прошлом
Да, предыдущее моё сообщение - как раз про отсутствие "страшных лент".
...
Рейтинг: 0 / 0
Зависание GUI
    #39591213
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот вам пример с кнопками старт и стоп.

И всё работает - обращение к компонентам нормально.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    ProgressBar1: TProgressBar;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Thread: TThread;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Thread.Resume;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Thread.Suspend;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Button1.Caption := 'start';
  Button2.Caption := 'stop';
  ProgressBar1.Max := 1000;

  Thread := TThread.CreateAnonymousThread(
    procedure
    begin
      while ProgressBar1.Position < ProgressBar1.Max do
      begin
        ProgressBar1.Position := ProgressBar1.Position + 1;

        Form1.Caption := ProgressBar1.Position.ToString;
      end;
    end);
end;

end.



YuRock,
Посмотри как реализован CreateAnonymousThread. Он заменяет и твою ленту
...
Рейтинг: 0 / 0
Зависание GUI
    #39591217
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я хочу подметить один факт

- Потоки не надо создавать бесконечно. Достаточно 1 - 5 ... Пусть живут всю программу, и с ними работаем.

И не важно, создался ли новый класс этот анонимный. Вы такой же класс пишите ручками.
...
Рейтинг: 0 / 0
Зависание GUI
    #39591224
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл в пример добавить завершение для формы

Код: pascal
1.
2.
3.
4.
5.
procedure TForm1.FormDestroy(Sender: TObject);
begin
  Thread.Suspend;
  Thread.Terminate;
end;



Но опять - же, две строчки.. И поток убит
...
Рейтинг: 0 / 0
Зависание GUI
    #39591233
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикИ всё работает - обращение к компонентам нормально.
1. Работает случайно, пока везёт (обращения к объектам-компонентам ни разу не синхронизированы);
2. Работает только один раз (Resume и Suspend не помогут начать сначала).

НяшикYuRock, Посмотри как реализован CreateAnonymousThread. Он заменяет и твою ленту
Мне негде посмотреть, но мне хватило доку почитать, чтобы понять, что он FreeOnTerminate-only (как я и ожидал), а значит практически всегда не пригоден для использования.
...
Рейтинг: 0 / 0
Зависание GUI
    #39591240
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикЗабыл в пример добавить завершение для формы

Код: pascal
1.
2.
3.
4.
5.
procedure TForm1.FormDestroy(Sender: TObject);
begin
  Thread.Suspend;
  Thread.Terminate;
end;




Но опять - же, две строчки.. И поток убит
удивительная способность делать простое сложным
...
Рейтинг: 0 / 0
Зависание GUI
    #39591243
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик
Код: pascal
1.
2.
3.
4.
5.
procedure TForm1.FormDestroy(Sender: TObject);
begin
  Thread.Suspend;
  Thread.Terminate;
end;



Но опять - же, две строчки.. И поток убит
Ты, похоже, никогда не программировал, используя несколько потоков, раз пишешь (да еще и советуешь) такое.
Если б хоть раз попробовал - отпало бы желание прерывать свой код некорректно (в неизвестном месте).
...
Рейтинг: 0 / 0
Зависание GUI
    #39591251
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

увы, всё не настолько просто. но в случае тс только один вызов синхронизировать нужно.
...
Рейтинг: 0 / 0
Зависание GUI
    #39591252
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докудивительная способность делать простое сложным
Больше похоже на попытки рандомного программирования. Вызовы первых попавшихся под руку функций в случайном порядке, не парясь на счет того, что они делают и зачем нужны.
...
Рейтинг: 0 / 0
Зависание GUI
    #39591253
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

так и есть
...
Рейтинг: 0 / 0
Зависание GUI
    #39591256
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть такой устоявшийся термин - "судорожное программирование"
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Зависание GUI
    #39591259
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот, к слову, упомянутая либа:

https://github.com/ahausladen/AsyncCalls

Requirements
Supported compilers: Delphi 5 to 10.1
Supported platforms: Win32, Win64

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
procedure TForm1.Button3Click(Sender: TObject); 
var 
  Value: Integer; 
begin 
  TAsyncCalls.Invoke(procedure 
  begin 
    // Executed in a thread
    Value := 10; 
    TAsyncCalls.VCLInvoke(procedure 
    begin 
      ShowMessage('The value may not equal 10: ' + IntToStr(Value)); 
    end); 
    Value := 20; 
    TAsyncCalls.VCLSync(procedure 
    begin 
      ShowMessage('The value equals 20: ' + IntToStr(Value)); 
    end); 
    Value := 30; 
  end); 

  Sleep(1000); 
end; // If the async. function is run yet, the "end" will sync it


Я у себя из компонент использую жедаевский TJvThread. И самописанный TThreadTimer.
Тут на форуме Wadman своё изобразил ещё :)
Жедаевский довольно удобный. Кинул, OnExecute обработал. Синхронно поменял прогресс и забыл весь кошмар как жуткий сон.
Синхронное продвижение прогресса:
TThread.Synchronize, TThread.Queue, SendMessage, PostMessage, можно выбрать, любой будет работать.
...
Рейтинг: 0 / 0
Зависание GUI
    #39591282
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикНо опять - же, две строчки.. И поток убитУверен? А спорим, что нет?
...
Рейтинг: 0 / 0
Зависание GUI
    #39591310
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

Я правильно понял, что `TAsyncCalls.VCLSync()` будет ждать исполнения ShowMessage() в основном потоке, а основной поток в этот момент будет ждать завершения `TAsyncCalls.Invoke()` на строчке
Код: pascal
1.
end; // If the async. function is run yet, the "end" will sync it

?.. Т.е. программа тупо зависнет? :)
...
Рейтинг: 0 / 0
25 сообщений из 53, страница 2 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Зависание GUI
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]