powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Компонент FIB Plus Dataset
25 сообщений из 57, страница 2 из 3
Компонент FIB Plus Dataset
    #40006331
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
сделай так:
Где вероятный AV показать или сам найдешь?
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40006414
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Где вероятный AV показать

покажи, только пальцем :)
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40006420
Mixrud
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Никогда не стоит делать вот так.
Код: pascal
1.
2.
3.
4.
5.
 while not NewThread.Terminated do
    begin
       Application.ProcessMessages;
       Sleep(50);
    end;



Но код Дока слава богу работать не будет.
dstOtchetD.Open;
пока не отработает в основном потоке до художеств с Application.ProcessMessages не дойдет.
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40006587
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
покажи, только пальцем :)

Док
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
procedure TfrmOtchetD.ButtonOkClick(Sender: TObject);
begin
    NewThread:=TNewThread.Create(true);
    NewThread.FreeOnTerminate:=true;  // Вызвать деструктор по завершению потока
    NewThread.Priority:=tpLower;
    NewThread.Resume;

    dstOtchetD.Open;
    frmOtchetD.ProgressBarD.Style := pbstNormal;
    NewThread.Start;

    // Идет проверка значения поля объекта, который не факт, что существует
    while not NewThread.Terminated do  
    begin
       Application.ProcessMessages;
       Sleep(50);
    end;
    ProgressBarD.Visible := False;
end;

...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40006814
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

тебя смущает, что поток может быть не создан? Ну дык, или делай FreeOnTerminate = False и прибивай вручную (я обычно так и делаю), или проверяй наличие объекта. Или я неправильно мыслю? Или ты хочешь универсально-эффективный код привести? :)


Mixrud,

да, вы верно подметили. В контексте задачи ТС ему бы коннект в доп.потоке сделать, а наружу вывести модальный сплэш. Согласен.
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40006824
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
_Vasilisk_,
тебя смущает, что поток может быть не создан? Ну дык, или делай FreeOnTerminate = False и прибивай вручную (я обычно так и делаю), или проверяй наличие объекта. Или я неправильно мыслю? Или ты хочешь универсально-эффективный код привести? :)

Его смущает, что за время выполнения кода между 'NewThread.Resume' и 'while not NewThread.Terminated do' поток может уже завершиться и освободиться, поэтому NewThread (.Terminated) будет указывать на мусор. Более того, как только поток завершится то NewThread (.Terminated) гарантированно будет указывать на мусор, и будет там AV или нет зависит только от того - успеет ли кто-нибудь переписать память, на которую указывает NewThread.
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40006848
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,
mea culpa.

Потер предыдущее сообщение, потому что при практически любом раскладе получается хрень: если FreeOnTerminate = True, то при уничтожении экземпляра NewThread там все равно остается мусор (т.е. NewThread <> nil), а значит _Vasilisk_ прав в отношении возможного AV.

Вот кстати вопрос, а если в деструкторе TNewThread сделать так:
Код: pascal
1.
2.
3.
4.
5.
destructor TNewThread.Destroy;
begin
  self:= nil;
  inherited;
end;



то всяческие проверки Assigned() прокатят?

ps. насчет ProcessMessages я так ни разу и не услышал убедительных аргументов, почему его не стоит применять.
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40006873
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
type
  TMyThread = class(TThread)
  protected
    procedure Execute; override;
  end;


  TForm1 = class(TForm)
    ProgressBar1: TProgressBar;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    FMyThread: TMyThread;
    procedure OnThreadTerminated(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not Assigned(FMyThread) then
  begin
    FMyThread := TMyThread.Create(True);
    FMyThread.FreeOnTerminate := True;
    FMyThread.OnTerminate := OnThreadTerminated;
    ProgressBar1.Style := pbstMarquee;
    ProgressBar1.Visible := True;
    FMyThread.Start;
  end;
end;

{ TMyThread }

procedure TMyThread.Execute;
begin
  inherited;
  //Длительный Open
  Sleep(5000);
end;

procedure TForm1.OnThreadTerminated(Sender: TObject);
begin
  FMyThread := nil;
  ProgressBar1.Visible := False;
end;
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40006887
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
то всяческие проверки Assigned() прокатят?
Нет. У тебя получится по сути так
Код: pascal
1.
2.
3.
4.
a := 5;  // NewThread := TNewThread.Create;
b := a;  // NewThread.DoSomething
b := 0;  // Self := nil
if a <> 0 then  // if Assigned(NewThread)


Док
ps. насчет ProcessMessages я так ни разу и не услышал убедительных аргументов, почему его не стоит применять.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var
  GVar: Integer;

procedure TForm1.Button1Click(Sender: TObject);
var
  Li: Integer;
begin
  GVar := 0;
  for Li := 0 to 1000000 do begin
    Application.ProcessMessages;
    Inc(GVar);
  end;
  ShowMessage(IntToStr(GVar));
end;

запусти программу и понажимай несколько раз кнопку
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40007013
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
запусти программу и понажимай несколько раз кнопку

а тут-то оно (ProcessMessages) зачем?

istrebitel,
гуд, возьму на заметку
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40007014
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
09.10.2020 16:32, Док пишет:
> а тут-то оно (ProcessMessages) зачем?

наглядное пособие
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40007036
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
запусти программу и понажимай несколько раз кнопку

Ну так и болгаркой можно что-то нужное отхватить, но это ж не повод её запретить.
Просто надо понимать, как всё работает. Тогда и PM не страшен
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40007039
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
09.10.2020 17:26, Fr0sT-Brutal пишет:
> Ну так и болгаркой можно что-то нужное отхватить, но это ж не повод её запретить.
> Просто надо понимать, как всё работает. Тогда и PM не страшен

не надо пользовать то что надо не так как надо!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40007096
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
а тут-то оно (ProcessMessages) зачем?
Ну по классике же "чтобы не замирал интерфейс при длительных вычислениях"

Чем мой пример принципиально отличается от твоего?
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40007306
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Чем мой пример принципиально отличается от твоего?

в твоем примере без PM интерфейс должен замереть?

Мимопроходящий
не надо пользовать то что надо не так как надо!

Саш, может ты мне вразумительно сможешь донести?
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40007324
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
Саш, может ты мне вразумительно сможешь донести?
Ты же уже понял, что длительную операцию с "отрисовкой" местами перепутал?
Да и вообще в цикле так проверять и РМить при использовании потоков срамно.
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40007457
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
РМить при использовании потоков срамно.

Вот это я никак в толк не возьму. Почему срамно-то? Если я не хочу модальное окно вешать, а хочу, скажем, чтобы результат работы доп. потока в мемо основного потока выводился? Есть ещё какой кошерный способ для таких случаев? Допустим, AV мы не боится, потому что поток создаём и прибиваем ручками в try..finally.
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40007477
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док> чтобы результат работы доп. потока в мемо основного потока выводился?

Какой результат работы, если он тупо висит на Open, там
никаких прогресс-баров быть не может, максимум - анимашка.

> Есть ещё какой кошерный способ для таких случаев?

Каких "таких"? Если дождаться конца фонового выполнения
и создаётся/завершается/уничтожается корректно и вручную и
не хочется возиться с сообщениями и т.д. - вполне достаточно
дождаться OnTerminate, это будет корректно.

Чем будет в это время заниматься главный поток - без никаких
циклов - личное дело пользователя (который может захотеть
ещё что-нибудь запустить/понажимать) и разработчика, если
нужно пользователя ограничить (не дать запустить фоновое
действие повторно, например).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40007553
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

ты опять по диагонали топик прочитал ;) Я уже написал, что в случае с кодом ТС я ошибся. А дальше пошел оффтоп. И мои вопросы к непосредственной теме уже имеют перпендикулярное отношение
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40007666
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
в твоем примере без PM интерфейс должен замереть?
А ты подвигай окошко
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40007883
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Док
в твоем примере без PM интерфейс должен замереть?
А ты подвигай окошко

без PM я даже до заголовка не успеваю дотянуться, сразу вылезает ShowMessage. А с PM все двигается корректно, единственное, окно закрыть не удается. Но мне кажется, что твой пример с нежелательностью PM надуман, ибо оно здесь и так нафиг не сдалось :)

...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40008013
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
без PM я даже до заголовка не успеваю дотянуться, сразу вылезает ShowMessage.
Блин, ну нельзя же так тормозить. Ну замедли цикл. Увеличь на пару порядков число итераций, добавь вычисления. В крайнем случае добавь в цикл Sleep(100)
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40008659
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

да, в этом случае ты формально прав - без PM гуй фризится насмерть.

ИМХО, это просто архитектурно неправильное решение, а не потому PM плохой. Ладно, надоело спорить. Появятся аргументы, напишу :)
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40008669
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

кстати, если твой пример немного переделать, то он вполне жизнеспособен
Код: 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.
  TForm1 = class(TForm)
  ...
  private
    FVar, FCnt: PtrUInt;
    FIsAllow: Boolean;
...
procedure TForm1.btnStartClick(Sender: TObject);
var Li: PtrInt;
begin
  Inc(FCnt);
  Label1.Caption:= Format('Кнопка Start нажата: %d раз',[FCnt]);

  if not FIsAllow then Exit;
  FIsAllow:= False;
  FVar:= 0;

  for Li := SmallInt.MinValue to SmallInt.MaxValue do
  begin
    if FIsAllow then Break;
    Inc(FVar);
    //Sleep(10);
    Label2.Caption:= Format('Текущее значение FVar: %d',[FVar]);
    Label3.Caption:= Format('Текущее значение счетчика итераций Li: %d',[Li]);
    Application.ProcessMessages;
  end;

  if not FIsAllow then
  begin
    FCnt:= 0;
    ShowMessage(IntToStr(FVar));
  end;
  FIsAllow:= True; 
end;

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  FIsAllow:= True;
end;





ps. а вообще, я уже забыл, о чем мы спорили :)
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40008711
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док, :)

Спор был о том, что корректно или нет использовать Application.ProcessMesages
Сама по себе эта функция не опасна, как и любой инструмент. Просто нужно правильно его использовать.
Application.ProcessMesages "проталкивает" очередь сообщений. И если в этой очереди сообщений попадётся сообщение, которое инициирует запуск того же цикла (как привёл пример _Vasilisk_), то может случиться конфуз. :)
В вашем примере вы флагом не даёте циклу начаться заново. И в данном случае нет ничего страшного в использовании Application.ProcessMesages.

ЗЫ: А ТС свалил, так и не сказав, к чему он пришёл, сделал ли визуализацию или что-то ещё... ))
...
Рейтинг: 0 / 0
25 сообщений из 57, страница 2 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Компонент FIB Plus Dataset
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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