powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как с помощью Post-сообщений заставить программу отображать надписи.
25 сообщений из 50, страница 1 из 2
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534389
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При нажатии кнопки должен выполняться следующий код (отображение информационной надписи),
Код: pascal
1.
2.
  PageControl1.ActivePageIndex := 0;
  LabelWait.Visible := true;


а затем довольно долгая (несколько секунд) процедура архивации. Во время архивации LabelWait должна отображать надпись "ПОДОЖДИТЕ..."
Так вот, при нажатии кнопки надпись не отображается, вместо этого кнопка зависает в нажатом состоянии до тех пор, пока процедура архивации не закончится, и потом отмораживается, и только после этого появляется надпись "Подождите..." на миг, после чего, естественно вызывается оператор спрятать эту надпись и отобразить "Готово!"

Пытался выйти из положения следующим способом:
Код: 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.
const
  WM_CREATE_ARCHIVE_SHOW = WM_USER + 1;

type
  TfmMain = class(TForm)
...
  private
    procedure CreateArchiveShow(var Msg: TMessage); message WM_CREATE_ARCHIVE_SHOW;
...
  end;

...

procedure TfmMain.CreateArchiveShow(var Msg: TMessage);
begin
  PageControl1.ActivePageIndex := 0;
  LabelWait.Visible := true;
end;

procedure TfmMain.btnSeqCreateArchiveClick(Sender: TObject);
begin
  PostMessage(fmMain.Handle, WM_CREATE_ARCHIVE_SHOW, 0, 0);
  
  // Создание архива
  .......
  .....
  .....
end;


Однако это не помогло. Кнопка по-прежнему зависает до окончания архивации, и никакая надпись не появляется до окончания.
...
Рейтинг: 0 / 0
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534391
_Navy_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
svnvlad,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TfmMain.btnSeqCreateArchiveClick(Sender: TObject);
begin
  PostMessage(fmMain.Handle, WM_CREATE_ARCHIVE_SHOW, 0, 0);
  
  Application.ProcessMessages; // Welcome to hell! :(

  // Создание архива
  .......
end;

Такие вещи (длительную обработку чего-либо) обычно выносят в отдельный тред. То есть как-то так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TfmMain.btnSeqCreateArchiveClick(Sender: TObject);
begin
  PageControl1.ActivePageIndex := 0;
  LabelWait.Visible := true;
  
  RunArchiveThread;  // Создание архива
  .......
end;
...
Рейтинг: 0 / 0
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534410
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Navy_
Код: pascal
1.
Application.ProcessMessages; 

не очень-то безопасен
сможет обработать нажатие клавиш или мышки
...
Рейтинг: 0 / 0
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534414
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и сразу - из доп. потоков нельзя без синхронизации обращаться к большинству визуальных компонент VCL.
...
Рейтинг: 0 / 0
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534415
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladОднако это не помогло. Кнопка по-прежнему зависает до окончания архивации, и никакая надпись не появляется до окончания.
Попробуй https://github.com/wadman/wthread/ :)
...
Рейтинг: 0 / 0
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534427
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
//Так вот, при нажатии кнопки надпись не отображается

А что должна ? :)

И где после LabelWait.Visible := true
LabelWait.Refresh ?
...
Рейтинг: 0 / 0
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534429
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladКнопка по-прежнему зависает до окончания архивации, и никакая надпись не появляется до окончания.
абсолютно предсказуемое поведение. Как советовали выше, только архивация в доп.потоке с перерисовкой надписи в основном потоке спасет ситуацию. У wadman 'а даже готовый прекрасный компонент есть
...
Рейтинг: 0 / 0
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534444
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad
Код: pascal
1.
2.
PageControl1.ActivePageIndex := 0;
  LabelWait.Visible := true;


При чем тут PostMessage - не понятно.
Код: pascal
1.
2.
3.
PageControl1.ActivePageIndex := 0;
  LabelWait.Visible := true;
  LabelWait.Update;
...
Рейтинг: 0 / 0
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534484
_Navy_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockПри чем тут PostMessage - не понятно.
Оно нафик не надо, но отработает, лабель покажет. Но таки да, перректально.

LSVИ где после LabelWait.Visible := true
LabelWait.Refresh ?YuRock
Код: pascal
1.
2.
  ...
  LabelWait.Update;

При вынесении архивации в доп. поток не нужно ни то, ни другое.
...
Рейтинг: 0 / 0
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534488
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Navy_При вынесении архивации в доп. поток не нужно ни то, ни другоеТС ни слова не спрашивал про потоки (может они и не подпрыгнули в этой задаче), а его засыпали, как обычно.
...
Рейтинг: 0 / 0
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534496
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
правильный подход ессно пустить поток и задизаблить кнопку
при возврате поток ее отменит обратно.
если нужен прогресс, то (самое простое решение) передаем в поток ссылку на прогресс-бар и дергаем ее желательно не очень часто через Synchronize
...
Рейтинг: 0 / 0
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534508
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkinчерез SynchronizeВот тут уж тогда лучше через PostMessage. Зачем к кривой технологии приучать, чтобы потом грабли разгребать и в итоге уходить от Synchronize.
...
Рейтинг: 0 / 0
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534541
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkinесли нужен прогресс, то (самое простое решение) передаем в поток ссылку на прогресс-бар и дергаем ее желательно не очень часто через Synchronizeдля прогресса StaticQueue может оказаться главнее
...
Рейтинг: 0 / 0
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534599
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockЗачем к кривой технологии приучать, чтобы потом грабли разгребать и в итоге уходить от Synchronize.А зачем приучать к велосипедостроению, вместо того, чтобы использовать специально предоставленный механизм?
...
Рейтинг: 0 / 0
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534646
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerYuRockЗачем к кривой технологии приучать, чтобы потом грабли разгребать и в итоге уходить от Synchronize.А зачем приучать к велосипедостроению, вместо того, чтобы использовать специально предоставленный механизм?Т.к. этот специальный механизм не всегда работоспособен, не говоря уже о его тормознутости и ограниченности. Обсуждалось уже много раз, снова не хочется.

Про какие велосипеды ты говоришь - не совсем понятно только. Работа с окнами идет через сообщения, посылаемые ф-циями Send/PostMessage.
Синхронизация между потоками достигается логикой архитектуры программы и, если надо, объектами синхронизации. Всё, точка. Никак не кривыми костылями.
...
Рейтинг: 0 / 0
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534653
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerYuRockЗачем к кривой технологии приучать, чтобы потом грабли разгребать и в итоге уходить от Synchronize.А зачем приучать к велосипедостроению, вместо того, чтобы использовать специально предоставленный механизм?
О каком специально предоставленном механизме идет речь? Synchronize или PostMessage?
...
Рейтинг: 0 / 0
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534669
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanО каком специально предоставленном механизме идет речь? Synchronize или PostMessage?Про Queue. Быстро и кросплатформенно.
...
Рейтинг: 0 / 0
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534679
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock.к. этот специальный механизм не всегда работоспособен, не говоря уже о его тормознутости и ограниченности. Обсуждалось уже много раз, снова не хочется.
Про какие велосипеды ты говоришь - не совсем понятно только. Работа с окнами идет через сообщения, посылаемые ф-циями Send/PostMessage.
Синхронизация между потоками достигается логикой архитектуры программы и, если надо, объектами синхронизации. Всё, точка. Никак не кривыми костылями.Если ты не умеешь готовить кошек - это не значит что они невкусные. Подтяни матчасть по TThread, там не только Synchronize.
...
Рейтинг: 0 / 0
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534684
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А уж обновить Label - тут ТС и Synchronize за глаза хватило бы
...
Рейтинг: 0 / 0
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534687
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
помнится до 6-й версии Synchronize как раз юзал sendmessage но с той поры благополучно отказался
...
Рейтинг: 0 / 0
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534700
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavanпомнится до 6-й версии Synchronize как раз юзал sendmessage но с той поры благополучно отказалсяЯ уже не помню таких подробностей
...
Рейтинг: 0 / 0
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534704
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> помнится до 6-й версии Synchronize как раз юзал sendmessage но с той поры благополучно отказался

подтверждаю.
в 5-ке:
[src=delphi]procedure TThread.Synchronize(Method: TThreadMethod);
begin
FSynchronizeException := nil;
FMethod := Method;
SendMessage(ThreadWindow, CM_EXECPROC, 0, Longint(Self));
if Assigned(FSynchronizeException) then raise FSynchronizeException;
end;[/src]

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534791
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
История такова: у меня была одна программа, использующая асинхронные сокеты, и в ней я благополучно решал проблему с помощью PostMessage. Сейчас уже не помню почему, но помню, что читал, что вместо Thread-ов и Synchronize рекомендовалось там как раз использовать PostMessage. Может быть неправильно понял, и от Thread-ов не надо отказываться.
...
Рейтинг: 0 / 0
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534821
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladИстория такова: у меня была одна программа, использующая асинхронные сокеты, и в ней я благополучно решал проблему с помощью PostMessage. Сейчас уже не помню почему, но помню, что читал, что вместо Thread-ов и Synchronize рекомендовалось там как раз использовать PostMessage. Может быть неправильно понял, и от Thread-ов не надо отказываться.В каждом случае нужно смотреть, что использовать. Создание thread-ов относительно небыстрая задача для оси. Быстрее будет использование системного пула потоков (а-ля QueueUserWorkItem и иже с ними). Я это использовал в наших продуктах для сортировки и фильтрации. Причем перформанс заметен даже на относительно небольших данных. Если бы делал через TThread - то поднятие и инициализации съели бы немало полезного времени
...
Рейтинг: 0 / 0
Как с помощью Post-сообщений заставить программу отображать надписи.
    #39534845
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerБыстрее будет использование системного пула потоков (а-ля QueueUserWorkItem и иже с ними).

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


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