powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TThread -> ProgressBar -> Основная форма
58 сообщений из 58, показаны все 3 страниц
TThread -> ProgressBar -> Основная форма
    #39830090
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня господа !

Прошу совета

Имею основную формe, в ней "подвал" TStatusBar (с набором панелей)

Имею класс TThread в нем осуществляется длительный процесс обработки данных.
Визуализация процесса обработки выводиться на объект TProgressBar
(который описан в виде поля и создан в классе TThread)

Но визуализацию "бегущей дорожки" хотелось бы видеть в основной форме,
на одной из панелей TStatusBar

1. как правильно синхронизировать процесс "бежания дорожки"
2. как правильно завести TProgressBar в одну из панелей TSatusBar - (TProgresBar.Parent:=TStatusBar.Panels[1])
3. размер TProgressBar=размеру TStatusBar.Panels[1]

Заранее благодарен !
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830097
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_Xописан в виде поля и создан в классе TThread

Вот второе - ошибка. Все визуальные компоненты (окна) должны создаваться в главном потоке.
Потом рабочему потоку можно отдать ссылку (лучше хэндл) этого окна чтобы он мог его
использовать для посылки сообщений (и, таким образом, визуализации своей работы).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830100
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830102
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Крутая фича
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830128
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovHOME_Xописан в виде поля и создан в классе TThread

Вот второе - ошибка. Все визуальные компоненты (окна) должны создаваться в главном потоке.
Потом рабочему потоку можно отдать ссылку (лучше хэндл) этого окна чтобы он мог его
использовать для посылки сообщений (и, таким образом, визуализации своей работы).


Нет вопросов - а как правильно организовать синхронизацию в момент Progress+1
Если с помощью Synchronize(Моя процедура) - будет все время тормозиться основная форма
- не будет большого смысла в потоке.
Поясните пожалуйста ..
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830138
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XПоясните пожалуйста ..
Сообщением главной форме.
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830140
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Не могли бы подослать код в качестве примера ...

Спасибо
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830141
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XПоясните пожалуйста ..

И лучше это делать не на каждой итерации, а разумно: 2-3 раза в секунду, обычно, достаточно.
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830146
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XНе могли бы подослать код в качестве примера ...
У формы есть Handle, форма может принимать сообщения http://www.cryer.co.uk/brian/delphi/howto_send_custom_window_message.htm
И есть процедура winapi: postmessage.
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830198
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanHOME_XНе могли бы подослать код в качестве примера ...
У формы есть Handle, форма может принимать сообщения http://www.cryer.co.uk/brian/delphi/howto_send_custom_window_message.htm
И есть процедура winapi: postmessage.
На Handle формы лучше не закладываться, он иногда может пересоздаваться. Надежнее хранить ссылку на форму. Либо создать хэндл в главном потоке самому через AllocateWnd
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830203
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
x1ca4064HOME_XПоясните пожалуйста ..

И лучше это делать не на каждой итерации, а разумно: 2-3 раза в секунду, обычно, достаточно.
Обычный таймер вполне подходит для этого.
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830209
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanСообщением главной форме.

Зачем главной-то? Отдаём хэндл прогресс-бара, соответственно и сообщение посылается прямо ему:
Код: sql
1.
PostMessage(ProgressBar.Handle, PBM_SETPOS, Percent, 0);


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830218
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747x1ca4064пропущено...
И лучше это делать не на каждой итерации, а разумно: 2-3 раза в секунду, обычно, достаточно.
Обычный таймер вполне подходит для этого.
Тогда вообще ничего передавать не надо, сделать свойство у TThred и через какой-нибудь InterlockedIncrement() его считывать/увеличивать.
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830221
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747Обычный таймер вполне подходит для этого.

Обычно, "Обычный таймер" :) , не используют в потоках.
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830223
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
x1ca4064Cobalt747Обычный таймер вполне подходит для этого.

Обычно, "Обычный таймер" :) , не используют в потоках.
Очевидно, что таймер будет на форме, нет? :)
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830239
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpсделать свойство у TThred и через какой-нибудь InterlockedIncrement() его
считывать/увеличивать.
Interlocked функции в данном случае совершенно ни к чему.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830334
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Не совсем понял - Вы предложили использовать Win API (PostMessage и т.д.)
Зачем ? Вы хотите "связать-развязать" потоки через операционку ?

Почему нельзя передать указатель на TProgressBar в конструктор потока
TThread.Create(......,,,a: TProgressBar....) , держать его как поле потока и не-
посредственно к нему обращаться в процессе цикла ? Тут есть противоречие ?

Мне не ясно как будет делаться прорисовка строки основного потока (окна), если
значение меняет второстепенный поток.

Т.е. Synchronize(.....) использовал для синхронизации переменных, команда останав-
ливала все действия и синхронизировала ИЗМЕНЕННЫЕ ресурсы во времени.

В моем случае - меняет переменную "Progress + 1" только вспомогательный поток.
На главном потоке идет считывание, команда Synchronize(.....) - нужна ли вообще ?
И как основной поток знает что "Progress + 1" изменился, чтобы отRefresh - ть строку ?

Спасибо .
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830344
AlexeyM123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бесплатная книга

Getting started with Embarcadero Delphi

https://riptutorial.com/topic?q=delphi&submit=Search

Chapter 8: Running a thread while keeping GUI responsive
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830362
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XПочему нельзя передать указатель на TProgressBar в конструктор потока
TThread.Create(......,,,a: TProgressBar....) , держать его как поле потока и не-
посредственно к нему обращаться в процессе цикла ? Тут есть противоречие ?

C точки зрения архитектуры это плохая практика.
Мухи (расчет) - отдельно, котлеты (визуализация) - отдельно. Когда понадобиться сделать другой индикатор или добавить, скажем, запись логов придется все переделывать.
Лучше сразу писать правильно- отослал сообщение и пусть на той стороне решают что с ним делать.
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830366
Александр Спелицин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,
Всё дело в том, что VCL не является потокобезопасной. Т.е. если из разных потоков рисовать на канве окна, то можно получить ошибку. Вот по этому и следует делать так, чтобы все визуальные изменения делались в основном потоке, а расчеты вынести во вспомогательный поток. А вспомогательный поток уже уведомляет основной о том, что процент выполнения задачи изменился.
Самое простое - создать в форме обработчик Вашего пользовательского сообщения, из которого менять % в прогрессбаре.
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830371
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XВы предложили использовать Win API (PostMessage и т.д.)
Зачем ?

Затем, что это самый простой, надёжный и безопасный способ.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830376
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VCL не тред-сейф, а вот WinAPI вполне. Т.ч. если отсылать из фонового потока Post/SendMessage хэндлу окна, то всё ОК. Вариант с событием OnProgress у фонового потока и его обработчик - это верное решение. Только вот надо держать в уме, что обработчик вызывается в контексте другого потока - это не всегда получается.
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830381
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
25.06.2019 15:06, Василий 2 пишет:
> VCL не тред-сейф, а вот WinAPI вполне.

имеешь весьма поверхностные знания об архитектуре Вын.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830404
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обоснуй
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830430
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
25.06.2019 16:00, Василий 2 пишет:
> Обоснуй

начни с букварей.
практически вся низкоуровневая работа с GUI средствами WinAPI из разных потоков
требует от программера специальных танцев с бубнами.
в общем случае заявлять, что с многопоточностью там всё ув шуколаде,
мягко говоря, некорректно.

если интересны подробности, можно почитать статьи Раймонда Чена на эту тематику.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830441
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну например? Рисование да, канвасы надо блокировать вручную. А вот большинство команд над окнами и соответственно контролами выполняются через SendMessage.
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830450
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
25.06.2019 17:28, Василий 2 пишет:
> большинство команд над окнами и соответственно контролами выполняются через SendMessage.

в букварь.
читать про очереди сообщений WinAPI, как и кем они создаются, кем и как обрабатываются.

зы: в дальнейшем "диспуте" участвовать не намерен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830607
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийзы: в дальнейшем "диспуте" участвовать не намерен.

И правильно, потому что толку от тебя в нем ноль целых шиш десятых
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830962
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Доброго дян господа !

Реализован 1-й вариант

В второстепенный поток передан и в поле потока зафиксирован указатель на TProgrsssBar основной формы
В цикле потока работаю с ним
Код: pascal
1.
2.
     
pbMain.Position:=pbMain.Position+1;


Вопросов и замечаний нет

Реализован 2-й вариант
В второстепенный поток передан и в поле потока зафиксирован указатель на TProgrsssBar основной формы
В цикле потока работаю с Handle окна
Код: pascal
1.
      PostMessage(pbMain.Handle,PBM_SETPOS,Trunc(adoRead.RecNo/adoRead.RecordCount*100),0);


Вопросов и замечаний нет (adoRead - это TADOQuery)

Процедуру Synchronize - НЕ (!!!!!!!!) использовал в обоих случаях

В чем прелесть последнего варианта .... ?
Исключил системную библиотеку VCL и взял по собственный контроль "Position+1"
(так системщики все равно пишут лучше....)

Или я неверно понял и применил Ваше предложение ?


Спасибо
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830980
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

да куча, оба варианта могут привести к проблемам

pbMain.Handle, смотрел на код .GetHandle ? особенно с условием на FWindowHandle = 0. аналогично с pbMain.Position


если не знаешь как внутрях крутится лучше пользуй рекомендованный synchronize или что практичнее, таймер.
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830991
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

" а таймер - это НЕ отдельный поток "
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830995
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

насчет Synchronize(Моя процедура) - здесь надо использовать с осознанием дела,
если после каждой итерации wbrkf второстепенного потока, делать Synchronize -
"погасите" (обездвижите) основную форму.

Планирую использовать если два потока МЕНЯЮТ значение ресурса
А если один меняет и второй читает - наверное не стоит...

Господа гуру - что на это скажите ?
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39830999
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_Xkealon(Ruslan),

насчет Synchronize(Моя процедура) - здесь надо использовать с осознанием дела,
если после каждой итерации цикла второстепенного потока, делать Synchronize -
"погасите" (обездвижите) основную форму.

Планирую использовать если два потока МЕНЯЮТ значение ресурса
А если один меняет и второй читает - наверное не стоит...

Господа гуру - что на это скажите ?
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39831001
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_Xkealon(Ruslan),
насчет Synchronize(Моя процедура) - здесь надо использовать с осознанием дела,
если после каждой итерации wbrkf второстепенного потока, делать Synchronize -
"погасите" (обездвижите) основную форму.
Необязательно.
Все определяется количеством итераций и временем их выполнения.
Если очень много, и они короткие, нужно задуматься над возможностью основного потока выполнять какие-то другие задачи кроме перерисовки ProgressBar-а, например делать это по таймеру, а в обработке сообщения просто инкрементировать счетчик.
Если итераций мало и они длинные можно делать как угодно, разницы не будет.
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39831005
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
27.06.2019 10:26, kealon(Ruslan) пишет:
> pbMain.Handle, смотрел на код .GetHandle ? особенно с условием на FWindowHandle = 0. аналогично с pbMain.Position

не надо заранее изобретать проблемы там где их нет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39831006
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Handle у VCL контролов ненадежен
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39831008
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий27.06.2019 10:26, kealon(Ruslan) пишет:
> pbMain.Handle, смотрел на код .GetHandle ? особенно с условием на FWindowHandle = 0. аналогично с pbMain.Position

не надо заранее изобретать проблемы там где их нет.
вам тоже советую посмотреть этот исходник, особенно интересный момент, когда CreateWindow выполнится в вашем потоке
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39831009
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_Xчто на это скажите ?
Возьми обертку над потоком: https://github.com/wadman/wthread

Примерный код на выходе:
Код: 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.
type
  TForm2 = class(TForm)
    OtherThread: TWCThread;
    VeryHardTask: TTask;
    butStart: TButton;
    progressBar: TProgressBar;
    procedure butStartClick(Sender: TObject);
    procedure VeryHardTaskExecute(const Sender: TTask; const Msg: Word; var Param: Variant);
    procedure VeryHardTaskProgress(const Sender: TTask; const Msg, Value: Word);
    procedure VeryHardTaskFinish(const Sender: TTask; const Msg: Word; const Param: Variant);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.butStartClick(Sender: TObject);
begin
    progressBar.Position := 0;
    VeryHardTask.Start;
end;

procedure TForm2.VeryHardTaskExecute(const Sender: TTask; const Msg: Word; var Param: Variant);
var i: integer;
begin
    // other thread
    i := 0;
    while (i < 100) and (not Sender.Terminated) do begin
        Sender.WaitMs(100);
        inc(i);
        Sender.PostProgress(i);
    end;
end;

procedure TForm2.VeryHardTaskFinish(const Sender: TTask; const Msg: Word; const Param: Variant);
begin
    // very hard task finished
    ShowMessage('Finished');
end;

procedure TForm2.VeryHardTaskProgress(const Sender: TTask; const Msg, Value: Word);
begin
    // from sender.postProgress
    progressBar.Position := Value;
end;

...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39831010
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
елы-палы, проблема - промитивная. А столько копий вокруг этого сломано.

зы. у меня уже попкорн закончился...
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39831011
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2Handle у VCL контролов ненадежен

Не слишком ли много Джордж толкует о том, что мы перевернемся? Готовиться к путешествию на лодке с таким настроением – последнее дело (с)

Handle персистентного окна может стать невалидным, ЕМНИП, только при перезапуске проводника. Городить ради этого сложную архитектуру... по мне так не стоит.
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39831017
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский БорисВасилий 2Handle у VCL контролов ненадежен

Не слишком ли много Джордж толкует о том, что мы перевернемся? Готовиться к путешествию на лодке с таким настроением – последнее дело (с)

Handle персистентного окна может стать невалидным, ЕМНИП, только при перезапуске проводника. Городить ради этого сложную архитектуру... по мне так не стоит.пипец сложность: в потоке записал переменную, в таймере вывел

но конечно лучше наложить, а потом искать кто накосячил, при каком-то изменении.
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39831025
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)пипец сложность: в потоке записал переменную, в таймере вывел Предлагаю поискать в коде TTimer реакцию на пересоздание окна и после ответа обосновать, чем это надежнее.
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39831028
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис,
сложно представить случай в котором имплементированная им абстракция не будет работать.
Кто убьёт окно таймера, созданное по всем правилам VCL?
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39831035
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Соколинский Борис,
сложно представить случай в котором имплементированная им абстракция не будет работать.
Кто убьёт окно таймера, созданное по всем правилам VCL? Тот же, кто потенциально может грохнуть окно персистентной формы, не вижу принципиальной разницы.
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39831050
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис,

неисполнение контракта(OnTimer) это уже серьёзный глюк базовых компонентов, причём скорее всего причина будет на уровне ОС, а абъюз внутренних особенностей реализации - это непрофессиональность программиста.

Я в своей практике, правда, встречал дурней, которые на таймер вешали лимит на время работы программы, но это уже совсем другая история.
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39831069
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)неисполнение контракта(OnTimer) это уже серьёзный глюк базовых компонентов, причём скорее всего причина будет на уровне ОС, а абъюз внутренних особенностей реализации - это непрофессиональность программиста. Использование глючных базовых/сторонних компонентов - такой же признак непрофессионализма.
А абсолютно уверен, что подавляющее большинство более-менее сложных десктопных приложений в таких форс-мажорных ситуациях либо просто упадет, либо будет глючить по самым разным причинам. Посему нет смысла бороться с перхотью если почки отказали.
Если, разве что, софт не предназначен для управления баллистическими ракетами.
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39831073
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вот, скатились до того, что дельфи гамно, а потом идут вопросы "почему не работает что-то у очередного пионера"
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39831081
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вындовс - говно.
хотя, и линукс-GUI, говно не меньшее.

в последнее время сижу под Цынамоном.
оно конечно работает вполне прилично.
но, то там косячок, то сям косячок...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39831189
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский БорисВасилий 2Handle у VCL контролов ненадежен

Не слишком ли много Джордж толкует о том, что мы перевернемся? Готовиться к путешествию на лодке с таким настроением – последнее дело (с)

Handle персистентного окна может стать невалидным, ЕМНИП, только при перезапуске проводника. Городить ради этого сложную архитектуру... по мне так не стоит.
Не слишком. Пробегись по Vcl.Forms и посмотри, сколько там вызовов RecreateWnd.
TApplication.Handle по идее более устойчив, т.к. на нем нет этой обвязки от TWinControl, а создается он через честный CreateWindowEx(WS_EX_TOOLWINDOW). Но я в итоге просто создаю невидимое окно сам через AllocateWnd
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39831202
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2Не слишком. Пробегись по Vcl.Forms и посмотри, сколько там вызовов RecreateWnd. Пробежался. Всего два обобщенных варианта: а) изменение стиля окна (FormStyle, Position etc) и изменение параметров винды типа BiDiMode. Это проблема даже не уровня перхоти.
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39831441
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самый надежный и быстрый вариант - передавать в поток Handle прогрессбара.
Если он пересоздастся (что вряд ли) - хотябы не упадет ничего и не зависнет.
Еще лучше вариант, конечно - отказ от VCL.
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39831442
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)ну вот, скатились до того, что дельфи гамно, а потом идут вопросы "почему не работает что-то у очередного пионера"Delphi - не гамно. VCL - гамно.
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39831493
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockkealon(Ruslan)ну вот, скатились до того, что дельфи гамно, а потом идут вопросы "почему не работает что-то у очередного пионера"Delphi - не гамно. VCL - гамно.
VCL не то чтобы говно, просто для него "прогроммист нужон" (С), который сначала изучает что и как работает, а потом уже делает.
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39831556
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WinAPI сам по себе не совсем сахар. Ну и VCL страдает как наследник. То хэндлы ненадежны, то еще что.
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39831602
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpVCL не то чтобы говно, просто для него "прогроммист нужон" (С)

VCL изначально была вполне адекватна, но потом к её программированию допустили студентов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39831608
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovVCL изначально была вполне адекватна... У меня ощущение, что, скажем, модуль Graphics изначально написан бесконтрольными студентами.
А контролер в последствии схватился за голову, но менять архитектуру уже было поздно, поэтому исправили только кое-какие ляпы.
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39831615
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
28.06.2019 12:54, Соколинский Борис пишет:
> У меня ощущение, что, скажем, модуль Graphics изначально написан бесконтрольными студентами.
> А контролер в последствии схватился за голову, но менять архитектуру уже было поздно, поэтому исправили только кое-какие ляпы.

Graphics перекочевал из OWL
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TThread -> ProgressBar -> Основная форма
    #39832217
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, как всегда в мемуары ударились...
По теме. Как я понимаю автор вопроса не обладает навыками многопоточной работы. В этом случае предлагаю не очень красивый, но надежный простейший вариант.
Где-то в общем юните заводится некая глобальная переменная Integer, в которой допустим хранятся десятые значения процента выполненной работы. Главная форма или что там еще просто по таймеру опрашивает значение этой глобальной переменной и устанавливает значение для прогрессбара. Добавочный поток просто записывает в переменную значения соответствующие текущей фазе работы, это будет атомарная операция и ни каких дополнительных телодвижений по синхронизации не потребуется. Если надо что-то более сложное типа строк, или массивов, то там уже нужны дополнительные телодвижения.
...
Рейтинг: 0 / 0
58 сообщений из 58, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TThread -> ProgressBar -> Основная форма
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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