Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как с помощью Post-сообщений заставить программу отображать надписи. / 25 сообщений из 50, страница 1 из 2
11.10.2017, 02:59:50
    #39534389
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с помощью Post-сообщений заставить программу отображать надписи.
При нажатии кнопки должен выполняться следующий код (отображение информационной надписи),
Код: 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
11.10.2017, 03:59:02
    #39534391
_Navy_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с помощью Post-сообщений заставить программу отображать надписи.
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
11.10.2017, 08:34:45
    #39534410
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с помощью Post-сообщений заставить программу отображать надписи.
_Navy_
Код: pascal
1.
Application.ProcessMessages; 

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

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

И где после LabelWait.Visible := true
LabelWait.Refresh ?
...
Рейтинг: 0 / 0
11.10.2017, 09:31:38
    #39534429
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с помощью Post-сообщений заставить программу отображать надписи.
svnvladКнопка по-прежнему зависает до окончания архивации, и никакая надпись не появляется до окончания.
абсолютно предсказуемое поведение. Как советовали выше, только архивация в доп.потоке с перерисовкой надписи в основном потоке спасет ситуацию. У wadman 'а даже готовый прекрасный компонент есть
...
Рейтинг: 0 / 0
11.10.2017, 09:51:59
    #39534444
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с помощью Post-сообщений заставить программу отображать надписи.
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
11.10.2017, 10:39:50
    #39534484
_Navy_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с помощью Post-сообщений заставить программу отображать надписи.
YuRockПри чем тут PostMessage - не понятно.
Оно нафик не надо, но отработает, лабель покажет. Но таки да, перректально.

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

При вынесении архивации в доп. поток не нужно ни то, ни другое.
...
Рейтинг: 0 / 0
11.10.2017, 10:42:31
    #39534488
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с помощью Post-сообщений заставить программу отображать надписи.
_Navy_При вынесении архивации в доп. поток не нужно ни то, ни другоеТС ни слова не спрашивал про потоки (может они и не подпрыгнули в этой задаче), а его засыпали, как обычно.
...
Рейтинг: 0 / 0
11.10.2017, 10:52:44
    #39534496
krapotkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с помощью Post-сообщений заставить программу отображать надписи.
правильный подход ессно пустить поток и задизаблить кнопку
при возврате поток ее отменит обратно.
если нужен прогресс, то (самое простое решение) передаем в поток ссылку на прогресс-бар и дергаем ее желательно не очень часто через Synchronize
...
Рейтинг: 0 / 0
11.10.2017, 11:24:01
    #39534508
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с помощью Post-сообщений заставить программу отображать надписи.
krapotkinчерез SynchronizeВот тут уж тогда лучше через PostMessage. Зачем к кривой технологии приучать, чтобы потом грабли разгребать и в итоге уходить от Synchronize.
...
Рейтинг: 0 / 0
11.10.2017, 12:00:06
    #39534541
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с помощью Post-сообщений заставить программу отображать надписи.
krapotkinесли нужен прогресс, то (самое простое решение) передаем в поток ссылку на прогресс-бар и дергаем ее желательно не очень часто через Synchronizeдля прогресса StaticQueue может оказаться главнее
...
Рейтинг: 0 / 0
11.10.2017, 12:50:52
    #39534599
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с помощью Post-сообщений заставить программу отображать надписи.
YuRockЗачем к кривой технологии приучать, чтобы потом грабли разгребать и в итоге уходить от Synchronize.А зачем приучать к велосипедостроению, вместо того, чтобы использовать специально предоставленный механизм?
...
Рейтинг: 0 / 0
11.10.2017, 13:28:22
    #39534646
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с помощью Post-сообщений заставить программу отображать надписи.
white_niggerYuRockЗачем к кривой технологии приучать, чтобы потом грабли разгребать и в итоге уходить от Synchronize.А зачем приучать к велосипедостроению, вместо того, чтобы использовать специально предоставленный механизм?Т.к. этот специальный механизм не всегда работоспособен, не говоря уже о его тормознутости и ограниченности. Обсуждалось уже много раз, снова не хочется.

Про какие велосипеды ты говоришь - не совсем понятно только. Работа с окнами идет через сообщения, посылаемые ф-циями Send/PostMessage.
Синхронизация между потоками достигается логикой архитектуры программы и, если надо, объектами синхронизации. Всё, точка. Никак не кривыми костылями.
...
Рейтинг: 0 / 0
11.10.2017, 13:32:35
    #39534653
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с помощью Post-сообщений заставить программу отображать надписи.
white_niggerYuRockЗачем к кривой технологии приучать, чтобы потом грабли разгребать и в итоге уходить от Synchronize.А зачем приучать к велосипедостроению, вместо того, чтобы использовать специально предоставленный механизм?
О каком специально предоставленном механизме идет речь? Synchronize или PostMessage?
...
Рейтинг: 0 / 0
11.10.2017, 13:51:18
    #39534669
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с помощью Post-сообщений заставить программу отображать надписи.
wadmanО каком специально предоставленном механизме идет речь? Synchronize или PostMessage?Про Queue. Быстро и кросплатформенно.
...
Рейтинг: 0 / 0
11.10.2017, 13:59:20
    #39534679
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с помощью Post-сообщений заставить программу отображать надписи.
YuRock.к. этот специальный механизм не всегда работоспособен, не говоря уже о его тормознутости и ограниченности. Обсуждалось уже много раз, снова не хочется.
Про какие велосипеды ты говоришь - не совсем понятно только. Работа с окнами идет через сообщения, посылаемые ф-циями Send/PostMessage.
Синхронизация между потоками достигается логикой архитектуры программы и, если надо, объектами синхронизации. Всё, точка. Никак не кривыми костылями.Если ты не умеешь готовить кошек - это не значит что они невкусные. Подтяни матчасть по TThread, там не только Synchronize.
...
Рейтинг: 0 / 0
11.10.2017, 14:02:58
    #39534684
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с помощью Post-сообщений заставить программу отображать надписи.
А уж обновить Label - тут ТС и Synchronize за глаза хватило бы
...
Рейтинг: 0 / 0
11.10.2017, 14:05:22
    #39534687
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с помощью Post-сообщений заставить программу отображать надписи.
помнится до 6-й версии Synchronize как раз юзал sendmessage но с той поры благополучно отказался
...
Рейтинг: 0 / 0
11.10.2017, 14:14:56
    #39534700
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с помощью Post-сообщений заставить программу отображать надписи.
vavanпомнится до 6-й версии Synchronize как раз юзал sendmessage но с той поры благополучно отказалсяЯ уже не помню таких подробностей
...
Рейтинг: 0 / 0
11.10.2017, 14:17:21
    #39534704
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с помощью Post-сообщений заставить программу отображать надписи.
> помнится до 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
11.10.2017, 15:41:49
    #39534791
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с помощью Post-сообщений заставить программу отображать надписи.
История такова: у меня была одна программа, использующая асинхронные сокеты, и в ней я благополучно решал проблему с помощью PostMessage. Сейчас уже не помню почему, но помню, что читал, что вместо Thread-ов и Synchronize рекомендовалось там как раз использовать PostMessage. Может быть неправильно понял, и от Thread-ов не надо отказываться.
...
Рейтинг: 0 / 0
11.10.2017, 16:14:49
    #39534821
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с помощью Post-сообщений заставить программу отображать надписи.
svnvladИстория такова: у меня была одна программа, использующая асинхронные сокеты, и в ней я благополучно решал проблему с помощью PostMessage. Сейчас уже не помню почему, но помню, что читал, что вместо Thread-ов и Synchronize рекомендовалось там как раз использовать PostMessage. Может быть неправильно понял, и от Thread-ов не надо отказываться.В каждом случае нужно смотреть, что использовать. Создание thread-ов относительно небыстрая задача для оси. Быстрее будет использование системного пула потоков (а-ля QueueUserWorkItem и иже с ними). Я это использовал в наших продуктах для сортировки и фильтрации. Причем перформанс заметен даже на относительно небольших данных. Если бы делал через TThread - то поднятие и инициализации съели бы немало полезного времени
...
Рейтинг: 0 / 0
11.10.2017, 16:47:26
    #39534845
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с помощью Post-сообщений заставить программу отображать надписи.
white_niggerБыстрее будет использование системного пула потоков (а-ля QueueUserWorkItem и иже с ними).

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


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